意图过滤器不';无法在android中使用ActivityTestRule

意图过滤器不';无法在android中使用ActivityTestRule,android,android-intent,android-espresso,android-testing,Android,Android Intent,Android Espresso,Android Testing,我有一个接受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" />

我有一个接受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));
        }
    }
}
@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);
    }
}
如果用户使用它,这个东西就可以完美地工作。现在我想为它创建一个测试。所以我写了这样的东西:

androidTest

<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));
        }
    }
}
@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);
    }
}
@RunWith(AndroidJUnit4.class)
@最大的
公共类登录测试{
@统治
public final ActivityTestRule main=新的ActivityTestRule(MainScreen.class);
@试验
public void checkSmth(){
单击magiclink();
//...
}
私有void clickMagicLink(){
String url=“com。myapp://login?session_id=“+utils.getSessionId();
意向i=新意向(意向.行动\视图);
i、 setData(Uri.parse(url));
主要发射活动(一);
}
}
但它不是启动
MagicLink
活动,而是启动
MAIN屏幕
活动(即
MAIN
)。我做错了什么

另外,我还看到了类似的东西:
newactivitytestrule(MainScreen.class,true,false)。但是有了这个构造函数,我的测试就开始了,但是android应用程序没有(我的意思是emulator启动了,但是应用程序没有)

总是启动被测试的活动。您不能使用它来启动任何其他活动。在这种情况下,它将始终启动
main活动
Intent
参数被传递给活动。这允许您在测试期间发送额外信息。意图不是用于选择要启动的活动

还要注意,文档中说

不要直接调用此方法,除非您明确要求不要使用中的launchActivity标志手动延迟启动活动

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

@RunWith(AndroidJUnit4.class)
@最大的
公共类MagicLinkTest{
@统治
public final ActivityTestRule main=新的ActivityTestRule(MainScreen.class,false,false);
@试验
public void testMagicLink(){
String url=“com。myapp://login?session_id=“+utils.getSessionId();
意向i=新意向(意向.行动\视图);
i、 setData(Uri.parse(url));
主要发射活动(一);
//断言就在这里
}
}
您也可以使用ActivityTestRule,但必须模拟与实际用户完全相同的操作。

始终启动正在测试的活动。您不能使用它来启动任何其他活动。在这种情况下,它将始终启动
main活动
Intent
参数被传递给活动。这允许您在测试期间发送额外信息。意图不是用于选择要启动的活动

还要注意,文档中说

不要直接调用此方法,除非您明确要求不要使用中的launchActivity标志手动延迟启动活动

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

@RunWith(AndroidJUnit4.class)
@最大的
公共类MagicLinkTest{
@统治
public final ActivityTestRule main=新的ActivityTestRule(MainScreen.class,false,false);
@试验
public void testMagicLink(){
String url=“com。myapp://login?session_id=“+utils.getSessionId();
意向i=新意向(意向.行动\视图);
i、 setData(Uri.parse(url));
主要发射活动(一);
//断言就在这里
}
}

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

我该怎么做才能启动另一个活动?@deathangel908您正在测试的应用程序的用例是什么?@deathangel908测试
MagicLink
,您应该使用
ActivityTestRule
。在我的测试用例中,我需要在
main屏幕
活动(和其他)中执行操作,该活动将向电子邮件发送神奇链接,用户单击链接并打开将用户登录到系统的
MagicLink
活动。最后的断言将是
currentActivity==LoggedPage
@deatangel908,那么您的测试应该模拟与实际用户完全相同的操作。或者,您可以直接测试
MagicLink
,就像我在编辑中显示的那样。如何启动另一项活动?@deatangel908您正在测试的应用程序的用例是什么?@deatangel908测试
MagicLink
,您应该使用
ActivityTestRule
。在我的测试用例中,我需要在
main屏幕
活动(和其他)中执行操作,该活动将向电子邮件发送神奇链接,用户单击链接并打开将用户登录到系统的
MagicLink
活动。最后的断言将是
currentActivity==LoggedPage
@deatangel908,那么您的测试应该模拟与实际用户完全相同的操作。或者,您可以直接测试
MagicLink
,就像我在编辑中显示的那样。