intent-filter 不适用于 android 中的 ActivityTestRule

intent-filter doesn't work with ActivityTestRule in android

我有一个接受深层链接的应用程序。

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>

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));
        }
    }
}

如果用户使用它,这个东西会完美运行。好吧,我现在想为它创建一个测试。所以我写了这样的东西:

android测试:

@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 activity,而是开始 MainScreen activity(即 MAIN)。我做错了什么?

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

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

另请注意文档说

Don't call this method directly, unless you explicitly requested not to lazily launch the Activity manually using the launchActivity flag in ActivityTestRule(Class, boolean, boolean).

如果你想测试你的 MagicLink activity,你可以使用 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>,但您必须模拟与实际用户完全相同的操作。