意图过滤器不';无法在android中使用ActivityTestRule
我有一个接受deeplink的应用程序 Manifest.xml:意图过滤器不';无法在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" />
<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
,就像我在编辑中显示的那样。