2017-01-16 10 views
1

私はディープリンクを受け入れるアプリケーションを持っています。インテントフィルタがアンドロイドのActivityTestRuleで動作しません

た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活動を開始する。この事は(MAINです)MainScreen活動を開始します。何が間違っていますか?

p.s.私もこのようなものを見た:new ActivityTestRule<>(MainScreen.class,true, false);。しかし、このコンストラクタで私のテストが始まりますが、アンドロイドアプリはありません(エミュレータが起動しますが、アプリケーションはありません)。

答えて

3

ActivityTestRule.launchActivity()は常にテストされているアクティビティを開始します。他のアクティビティーを開始するために使用することはできません。この場合、常に開始されますMainActivityIntentパラメーターがアクティビティーに渡されます。これにより、テスト中にエキストラを送信することができます。意図はではなく、起動するアクティビティを選択するのには使用されません。

はまた、ドキュメントが

を言うことに注意して明示的に怠惰ActivityTestRule(Class, boolean, boolean)にlaunchActivityフラグを使用して、手動でのアクティビティを起動しないように要求されない限り、このメソッドを直接呼び出さないでください。

あなた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 'を使うべきです。 –

関連する問題