2

一部のモデルに ActiveAndroid を使用しており、作業の単体テストを開始したいと考えていました。残念ながら、適切なコンテキストを使用して ActiveAndroid を初期化できないというエラーが大量に発生しています。

ActiveAndroid が初期化されます。

ActiveAndroid.initialize(コンテキスト)

次の方法でコンテキストを初期化しようとしました。

  1. Application を拡張するスタブ クラスを用意し、それを使用して db を初期化します。

    private class TestApp extends com.activeandroid.app.Application{
       @Override
       public void onCreate() {
         super.onCreate();
         initialiseDB(getDatabaseName());
       }
    
       protected String getDatabaseName() {
         return "sad";
       }
    
       private void initialiseDB(String dbName) {
          ActiveAndroid.initialize(this); 
       }
    }
    

クラスが .getPackageName() および .getApplicationContext() に対して null を返すため、これは失敗します。どちらも初期化によって内部的に使用されます。

ShadowContextWrapper も使用してみましたが、使い方が間違っている可能性があります。これが私が行った方法です:

    ShadowContextWrapper shadowContextWrapper = new ShadowContextWrapper();
    shadowContextWrapper.setApplicationName("appName");
    shadowContextWrapper.setPackageName("package");
    Context context = shadowContextWrapper.getApplicationContext();

このアプローチは、Robolectric の一部である ShadowContextWrapper.java:52 の NPE で失敗します。行自体:

    Context applicationContext = this.realContextWrapper.getBaseContext().getApplicationContext();

AS 1.2、robolectric3.0、activeandroid 3.1 を使用しています。

これは私が実行しているテストの例です。

@RunWith(CustomRobolectricTestRunner.class)
   public class ItemTest {

     public void setUp(){

     }

    @Test
    public void checkJUnitWork() {
       assertThat(true, is(true));
    }

    @Test
    public void testSave(){
       Item item = new Item("name", "units", 5.0, 4.5, 10.0);
       assertThat(item.getName(),is("name"));
    }

   public void tearDown(){

   }
}

私のカスタムランナーは次のとおりです。

public class CustomRobolectricTestRunner extends RobolectricTestRunner {

public CustomRobolectricTestRunner(Class<?> testClass)
        throws InitializationError {
    super(testClass);
    String buildVariant = (BuildConfig.FLAVOR.isEmpty()
            ? "" : BuildConfig.FLAVOR+ "/") + BuildConfig.BUILD_TYPE;
    String intermediatesPath = BuildConfig.class.getResource("")
            .toString().replace("file:", "");
    intermediatesPath = intermediatesPath
            .substring(0, intermediatesPath.indexOf("/classes"));

    System.setProperty("android.package",
            BuildConfig.APPLICATION_ID);
    System.setProperty("android.manifest",
            intermediatesPath + "/manifests/full/"
                    + buildVariant + "/AndroidManifest.xml");
    System.setProperty("android.resources",
            intermediatesPath + "/res/" + buildVariant);
    System.setProperty("android.assets",
            intermediatesPath + "/assets/" + buildVariant);

    ShadowContextWrapper shadowContextWrapper = new ShadowContextWrapper();
    shadowContextWrapper.setApplicationName("appName");
    shadowContextWrapper.setPackageName("package");
    Context context = shadowContextWrapper.getApplicationContext();

    ActiveAndroid.initialize(context);

}

}

4

1 に答える 1