意图过滤器不适用于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&lt;&gt;(MainScreen.class,true, false);。但是有了这个构造函数,我的测试开始了,但 android 应用程序没有(我的意思是模拟器启动但应用程序没有)

【问题讨论】:

【参考方案1】:

ActivityTestRule.launchActivity() 总是启动正在测试的活动。您不能使用它来启动任何其他活动。在这种情况下,它将始终以MainActivity 开头。 Intent 参数被传递给活动。这允许您在测试期间发送额外内容。 Intent 用于选择要启动的活动。

还要注意文档说

不要直接调用这个方法,除非你明确要求不要使用ActivityTestRule(Class, boolean, boolean)中的launchActivity标志手动延迟启动Activity。

如果你想测试你的MagicLink活动,你可以使用ActivityTestRule&lt;MagicLink&gt;

@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&lt;MainScreen&gt;,但您必须模拟与实际用户完全相同的操作。

【讨论】:

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

以上是关于意图过滤器不适用于android中的ActivityTestRule的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 12/API 31 中,地理围栏不适用于 IMMUTABLE 未决意图。为啥?

用于劫持特定网站URL的Android意图过滤器

Xamarin Android C#:使用 xml 资源文件夹和清单来定义用于检测连接的 USB 设备崩溃应用程序的意图过滤器

Google 登录不适用于 Android 的发布版本

Assetlinks.json 中的应用链接意图过滤器在 Android 上不起作用

Android:<provider> 中的“此处不允许使用元素意图过滤器”?