У меня есть приложение для Android, у которого есть класс MyApplication
, который наследуется от Application
.
Я создал несколько модульных тестов, которые работают с @RunWith(AndroidJUnit4.class)
. Если я запускаю каждый тест отдельно, все они проходят. Если я запускаю их вместе - сначала один проходит, а затем (некоторые из) других терпят неудачу.
Проблема заключается в том, что создается только один экземпляр MyApplication
, а затем он сохраняется и используется для всех тестов, что вызывает сбой, поскольку в MyApplication
есть состояние, которое ДОЛЖНО быть инициализировано только один раз.
Есть ли способ запуска модульных тестов (androidTest), чтобы приложение перезапускалось для каждого теста? Мне все равно, будет ли он медленным (например, приложение нужно будет переустанавливать каждый раз) Я просто хочу, чтобы тесты запускались независимо друг от друга.
Фактический код из unit test выглядит (по запросу @Zinc):
@RunWith(AndroidJUnit4.class)
public class AutoLogin_ActMainTest {
@Rule
public ActivityTestRule<ActMain> mActivityRule = new ActivityTestRule<ActMain>(
ActMain.class) {
@Override
protected void beforeActivityLaunched() {
super.beforeActivityLaunched();
MyTestApp app = (MyTestApp) InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext();
DependencyInjector.reset();
app.reset();
FakeUnitDaggerModule fudm = new FakeUnitDaggerModule();
Session session = new SessionImpl(new TimeProviderImpl());
fudm.setResMain(new ResMainTest(session));
FakeAppPrefs appPrefs = new FakeAppPrefs();
FakeLoginPrefs loginPrefs = new FakeLoginPrefs();
CurrentUserHolder currentUserHolder = new CurrentUserHolder();
FakeComponent inj = DaggerFakeComponent.builder().
fakeMyAppDaggerModule(new FakeMyAppDaggerModule(app, appPrefs, loginPrefs, currentUserHolder)).
appInfoDaggerModule(new AppInfoDaggerModule("1")).
fakeSessionDaggerModule(new FakeSessionDaggerModule(session)).
fakeExchangeDaggerModule(new FakeExchangeDaggerModule("https://test.com")).
fakeUnitDaggerModule(fudm).
build();
DependencyInjector.init(inj);
DependencyInjector.getInstance().inject(app);
app.onStart();
}
};
@Test
public void testAutoLogin() {
ElapsedTimeIdlingResource idlingResource = new ElapsedTimeIdlingResource(500);
Espresso.registerIdlingResources(idlingResource);
idlingResource.startWaiting();
onView(ViewMatchers.withId(R.id.tv_logged_in_as)).check(matches(isDisplayed()));
Espresso.unregisterIdlingResources(idlingResource);
}
}