Как я могу добавить модульный тест для события жизненного цикла компонентов архитектуры Android? - PullRequest
0 голосов
/ 29 июня 2018

Я попытался добавить модульный тест для своей функции, которая поддерживает событие жизненного цикла компонентов архитектуры. Чтобы поддержать событие жизненного цикла, я добавил аннотацию @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(), вызываемую при изменении состояния?

Ответы [ 3 ]

0 голосов
/ 13 июля 2018

Несмотря на то, что я не большой поклонник, я бы использовал Robolectric , использующий ActivityController для достижения этой цели.

Учитывая тот факт, что "Наблюдаемые" из шаблона Observer , примененного в Рабочий процесс жизненного цикла Android - это «Действия», «Фрагменты»… Необходим контекст приложения, и нам нужно каким-то образом привести его в наш тестовый сценарий.

Я достиг ожидаемого результата, сделав это

build.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;
    }
}
0 голосов
/ 15 октября 2018

Вы должны быть в состоянии использовать LifecycleRegistry

Ваш тест будет выглядеть примерно так:

@Test
public void testSomething() {
  LifecycleRegistry lifecycle = new LifecycleRegistry(mock(LifecycleOwner.class));

  // Instantiate your class to test
  CarServiceProvider carServiceProvider = new CarServiceProvider();
  carServiceProvider.bindToLifeCycle(lifecycle);

  // Set lifecycle state
  lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_STOP)

  // Verify that the ON_STOP event was handled, with an assert or similar check
  ...
}

Если вы тестируете Lifecycle.Event.ON_DESTROY , то вам, вероятно, необходимо до этого вызвать handleLifecycleEvent (Lifecycle.Event.ON_CREATE) .

0 голосов
/ 06 июля 2018

Если вы хотите протестировать его с помощью реального юнит-теста (не AndroidTest), вам лучше всего использовать Robolectric, он высмеивает фреймворк Android, и выходит Robolectric 4.0. Однако вы пытаетесь проверить фактическое взаимодействие с Android Framework, так что эта задача лучше подходит для настоящего комплекта тестирования интеграции и AndroidTest. Вы можете выполнить его модульное тестирование, но самый верный способ проверить это - фактически вызвать событие жизненного цикла на устройстве (что будет делать Espresso) и убедиться, что оно вызвано.

...