2016-12-09 11 views
0

アプリを実行してテストするために2つの異なるandroid.app.Applicationオブジェクトを使用します。これにより、私はテストと実行のための異なる設定をすることができます。テスト用に異なるandroid.app.Applicationオブジェクトを使用するにはどうすればよいですか?

src/main/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 

<uses-permission android:name="android.permission.INTERNET" /> 

<application 
    android:name=".SampleApplication" 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

と私のsrc/androidTest/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 

<uses-permission android:name="android.permission.INTERNET" /> 

<application 
    android:name=".TestApplication" 
    android:allowBackup="true" 
    android:label="Test Application" 
    android:supportsRtl="true" 
    > 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

MainActivityTest.java

@RunWith(AndroidJUnit4.class) 
@LargeTest 
public class MainActivityTest { 

    @Rule 
    public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(
      MainActivity.class); 


    @Test 
    public void response() throws Exception { 
     TextView textView = (TextView) mActivityRule.getActivity().findViewById(R.id.text); 
     String actualText = textView.getText().toString(); 
     Assert.assertEquals("foo", actualText); 
    } 
} 

私はそれぞれのためにしたいが、注釈がテストで無視されるように見えるアプリケーションのクラスへandroid:nameポイントは、TestApplicationが開始されることはありません注意してください。マニフェストは結合されていませんか?これらのアプリケーションクラスを交換する方が良い方法はありますか?

答えて

1

このblog postをご覧ください。具体的には最後の部分「計装テストでDagger 2を使用してテストの依存関係を模擬して注入する方法」を参照してください。

要するに、あなたは

public class CustomInstrumentationTestRunner extends AndroidJUnitRunner { 

    @Override 
    @NonNull 
    public Application newApplication(@NonNull ClassLoader cl, 
            @NonNull String className, 
            @NonNull Context context) 
            throws InstantiationException, 
            IllegalAccessException, 
            ClassNotFoundException { 
    return Instrumentation.newApplication(CustomApp.class, context); 
    } 
} 

カスタムランナーを所有して作成します。例としては、ブログ記事から取られbuild.gradle

android { 
    defaultConfig { 
    testInstrumentationRunner 'a.b.c.CustomInstrumentationTestRunner' 
    } 
} 

でそれを適用します。

src/androidTest/AndroidManifest.xmlについては、混乱しないでください。このマニフェストは、テスト対象のアプリケーションを対象とするのではなく、テストコードを含むアプリケーションに使用されます。

関連する問題