Как добавить модульный тест для события жизненного цикла компонентов архитектуры 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 4

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) и проверить его называемый.