Как добавить модульный тест для события жизненного цикла компонентов архитектуры android?
Я попытался добавить модульный тест для моей функции, которая поддерживает событие жизненного цикла компонентов архитектуры. Чтобы поддержать событие жизненного цикла, я добавил аннотацию @OnLifecycleEvent
для моей функции, которую я хочу сделать, когда это событие произошло.
Все работает, как ожидалось, но я хочу создать модульный тест для этой функции, чтобы проверить мою функцию, работающую, когда произошло предполагаемое событие.
public class CarServiceProvider implements LifecycleObserver {
public void bindToLifeCycle(LifecycleOwner lifecycleOwner) {
lifecycleOwner.getLifecycle().addObserver(this);
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onClear() {
Log.i("CarServiceProvider", "onClear called");
}
}
Я попытался издеваться над LifecycleOwner и создать новую LifecycleRegistery, чтобы изменить состояние конечно, но я этого не сделал.
Как я могу проверить мою onClear()
функцию, вызванную при изменении состояния ?
2 ответа:
Несмотря на то, что я не большой поклонник, я бы пошел с Robolectric, используя ActivityController для достижения этой цели.
Учитывая тот факт, что "наблюдаемые" модели наблюдателя применяются в Рабочий процесс жизненного цикла Android - это действия, фрагменты... Контекст приложения является обязательным, и мы должны каким-то образом использовать его для нашего тестового сценария.
Я достиг ожидаемого результата, сделав это
Строить.gradle
testCompile "org.robolectric:robolectric:3.5.1"
CarServiceProviderTest.java
@RunWith(RobolectricTestRunner.class) @Config(constants = BuildConfig.class) public class CarServiceProviderTest { @Test public void shouldFireOnClear(){ //Grab the Activity controller ActivityController controller = Robolectric.buildActivity(JustTestActivity.class).create().start(); AppCompatActivity activity = (AppCompatActivity) controller.get(); //Instanciate our Observer CarServiceProvider carServiceProvider = new CarServiceProvider(); carServiceProvider.bindToLifeCycle(activity); //Fire the expected event controller.stop(); //Assert Assert.assertTrue(carServiceProvider.wasFired); } }
CarServiceProvider.java
public class CarServiceProvider implements LifecycleObserver { public boolean wasFired; public void bindToLifeCycle(LifecycleOwner lifecycleOwner) { lifecycleOwner.getLifecycle().addObserver(this); } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) public void onClear() { wasFired = true; } }
Если вы хотите протестировать его с помощью реального юнит-теста (не AndroidTest), лучше всего использовать Robolectric, он издевается над Android-фреймворком, и Robolectric 4.0 выходит. Однако вы пытаетесь проверить реальное взаимодействие с платформой Android, так что эта задача лучше подходит для настоящего набора интеграционных тестов и AndroidTest. Вы можете провести модульный тест, но самый надежный способ проверить его-это фактически вызвать событие жизненного цикла на устройстве (что делает Espresso) и проверить его называемый.