一部のモデルに ActiveAndroid を使用しており、作業の単体テストを開始したいと考えていました。残念ながら、適切なコンテキストを使用して ActiveAndroid を初期化できないというエラーが大量に発生しています。
ActiveAndroid が初期化されます。
ActiveAndroid.initialize(コンテキスト)
次の方法でコンテキストを初期化しようとしました。
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);
}
}