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