Фильтр намерений не работает с ActivityTestRule в Android

У меня есть приложение, которое принимает 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));
        }
    }
}

Эта вещь работает отлично, если пользователь использует это. Ну, я хочу создать тест для этого сейчас. Поэтому я пишу что-то вроде этого:

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). Что я делаю не так?

Ps я тоже видел что-то вроде этого: new ActivityTestRule<>(MainScreen.class,true, false);, Но с этим конструктором мой тестовый запуск, а приложение для Android не (я имею в виду, эмулятор запускается, но приложение не)

1 ответ

Решение

ActivityTestRule.launchActivity() всегда начинает тестируемую деятельность. Вы не можете использовать его, чтобы начать любую другую деятельность. В этом случае он всегда начнется MainActivity, Intent параметр передается в действие. Это позволяет вам отправлять дополнения во время теста. Намерение не используется, чтобы выбрать, какое действие запустить.

Также обратите внимание, что документы говорят

Не вызывайте этот метод напрямую, если только вы явно не попросили не запускать Activity вручную, используя флаг launchActivity в ActivityTestRule(Class, boolean, boolean),

Если вы хотите проверить свои 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> но вы должны симулировать те же самые действия, что и реальный пользователь.

Другие вопросы по тегам