我有一个接受Deeplink的应用程序。

Manifest.xml:

<activity
    android:name=".activities.unsigned.MagicLink"
    android:label="Some test">
    <intent-filter android:label="Test">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="com.myapp" />
    </intent-filter>
</activity>
<activity
        android:name=".activities.unsigned.MainScreen">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>


活动:

public class MagicLink extends BusAppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = getIntent();
        if (intent != null && intent.getAction() != null) {
            Uri data = intent.getData();
            ServicesApi servicesApi = ServicesApi.init(this);
            servicesApi.setSessionId(data.getQueryParameter(HttpRemoteApi.SESSION_ID));
            startActivity(new Intent(this, LoginActivity.class));
        }
    }
}


如果用户使用此东西,它将完美地工作。好吧,我现在想为此创建一个测试。所以我写这样的东西:

androidTest:

@RunWith(AndroidJUnit4.class)
@LargeTest
public class LoginTest {
   @Rule
    public final ActivityTestRule<MainScreen> main = new ActivityTestRule<>(MainScreen.class);
    @Test
    public void checkSmth() {
         clickMagicLink();
         //...
    }

    private void clickMagicLink() {
        String url = "com.myapp://login?session_id="+utils.getSessionId();
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setData(Uri.parse(url));
        main.launchActivity(i);
    }
}


但是,不是开始MagicLink活动,而是启动MainScreen活动(即MAIN)。我做错了什么?

P.s.我还看到了这样的内容:new ActivityTestRule<>(MainScreen.class,true, false);。但是有了这个构造函数,我的测试就开始了,但是android应用却没有(我的意思是模拟器启动了,但是应用却没有)

最佳答案

ActivityTestRule.launchActivity()始终启动要测试的活动。您不能使用它来启动任何其他活动。在这种情况下,它将始终以MainActivity开始。 Intent参数传递到活动。这使您可以在测试期间发送其他内容。该意图不用于选择要启动的活动。

另请注意,文档说


  除非您明确要求不要使用ActivityTestRule(Class, boolean, boolean)中的launchActivity标志手动启动Activity,否则不要直接调用此方法。


如果要测试MagicLink活动,可以使用ActivityTestRule<MagicLink>

@RunWith(AndroidJUnit4.class)
@LargeTest
public class MagicLinkTest {
    @Rule
    public final ActivityTestRule<MagicLink> main = new ActivityTestRule<>(MainScreen.class, false, false);

    @Test
    public void testMagicLink() {
        String url = "com.myapp://login?session_id="+utils.getSessionId();
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setData(Uri.parse(url));
        main.launchActivity(i);

        // assertions go here
    }
}


您也可以使用ActivityTestRule<MainScreen>,但必须模拟与实际用户完全相同的操作。

关于android - Intent 过滤器不适用于Android中的ActivityTestRule,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41667917/

10-10 17:14