Я использую ActiveAndroid для некоторых своих моделей, и я хотел начать модульное тестирование моей работы. К сожалению, я получаю массу ошибок, а именно, неспособность инициализировать ActiveAndroid, используя соответствующий контекст.Тестирование модуля ActiveAndroid с использованием Robolectric
ActiveAndroid является iniatilized:
ActiveAndroid.initialize (контекст)
Я попытался инициализировать контекст по:
есть класс заглушки, расширяющий приложение и использовать его для инициализировать 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(), оба из которых используется внутри Initialize.
Я также пытался использовать ShadowContextWrapper, но я могу использовать его неправильно. Вот как я пошел об этом:
ShadowContextWrapper shadowContextWrapper = new ShadowContextWrapper();
shadowContextWrapper.setApplicationName("appName");
shadowContextWrapper.setPackageName("package");
Context context = shadowContextWrapper.getApplicationContext();
Этот подход не с NPE в ShadowContextWrapper.java:52 который часть Robolectric. Сама линия:
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(){
}
}
Мой заказ Runner выглядит следующим образом:
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);
}
}
Поскольку это модульное тестирование, я бы удалил ActiveRecord из тестов вообще –
Не могли бы вы также добавить в свой тестовый код и файл манифеста, который вы используете для своих тестов? У меня есть тайное подозрение, что может возникнуть нечто странное в том, как Robolectric создает приложение – abest
@EugenMartynov Эй. Я думал об этом. Но у меня есть своя бизнес-логика для моих моделей, которую я бы хотел проверить. Кроме того, я хотел бы выполнить некоторую работу с базами данных, например, установить данные об оборудовании и проверить ее. Таким образом, мне действительно нужно, чтобы это работало. –