意图过滤器不适用于android中的ActivityTestRule
Posted
技术标签:
【中文标题】意图过滤器不适用于android中的ActivityTestRule【英文标题】:intent-filter doesn't work with ActivityTestRule in android 【发布时间】:2017-05-30 18:59:45 【问题描述】:我有一个接受深层链接的应用程序。
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
)。我做错了什么?
附:我也看到了这样的东西:new ActivityTestRule<>(MainScreen.class,true, false);
。但是有了这个构造函数,我的测试开始了,但 android 应用程序没有(我的意思是模拟器启动但应用程序没有)
【问题讨论】:
【参考方案1】:ActivityTestRule.launchActivity()
总是启动正在测试的活动。您不能使用它来启动任何其他活动。在这种情况下,它将始终以MainActivity
开头。 Intent
参数被传递给活动。这允许您在测试期间发送额外内容。 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>
,但您必须模拟与实际用户完全相同的操作。
【讨论】:
我该怎么做才能开始另一个活动? @deathangel908 您正在测试的应用的用例是什么? @deathangel908 要测试MagicLink
,您应该使用ActivityTestRule<MagicLink>
。
在我的测试用例中,我需要在MainScreen
活动(和其他活动)中执行将魔术链接发送到电子邮件的操作,用户单击该链接并打开将用户登录到系统的MagicLink
活动.最后的断言将是currentActivity == LoggedPage
@deathangel908 然后您的测试应该模拟与实际用户完全相同的操作。或者,您可以直接测试MagicLink
,就像我在编辑中显示的那样。以上是关于意图过滤器不适用于android中的ActivityTestRule的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 12/API 31 中,地理围栏不适用于 IMMUTABLE 未决意图。为啥?
Xamarin Android C#:使用 xml 资源文件夹和清单来定义用于检测连接的 USB 设备崩溃应用程序的意图过滤器