1

У меня есть приложение, которое принимает deeplink.умышленный фильтр не работает с ActivityTestRule в 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> 

активность:

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). Что я делаю неправильно?

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

ответ

3

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

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

Не вызывать этот метод непосредственно, если явно не просил не лениво запустить активность вручную с помощью флага 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>, но вы должны имитировать те же действия, как фактический пользователь.

+0

Что мне делать, чтобы начать другое мероприятие? – deathangel908

+0

@ deathangel908 Каков пример использования вашего приложения, которое вы тестируете? –

+0

@ deathangel908 Чтобы проверить 'MagicLink', вы должны использовать' ActivityTestRule '. –