Как проверить переменную SingleLiveEvent <Void>? - PullRequest
2 голосов
/ 06 марта 2019

У меня есть SingleLiveEvent<Void> переменная.Получая ответ от API, я делаю это сообщение.Мой обратный вызов называется и отображается всплывающее окно.У меня вопрос, как мне написать тестовый пример для проверки, показывается ли мое всплывающее окно или нет.

Live Event:

private SingleLiveEvent<Void> onAccountOverDrawn = new SingleLiveEvent<>();

В случае успешного ответа я звоню:

onAccountOverDrawn.post();

В моем фрагменте я регистрирую его как

viewModel.getOnAccountOverDrawn().observe(this, aVoid -> onAccountOverDrawn());

, а в onAccountOverDrawn() я просто показываю всплывающее окно.

Так, как я напишу контрольный пример для этого сценария?

Текущий контрольный пример:

@Test
public void updateApplicationStatus_AccountOverdrawn() {
    viewModel.updateApplicationStatus("AMOUNT_PENDING");

    assertNotNull(viewModel.getOnAccountOverDrawn()); //this line is of no use. Need to change this.
}

Ответы [ 3 ]

0 голосов
/ 07 марта 2019

Если вы хотите проверить, были ли получены данные в реальном времени или нет, вы можете использовать следующий тест

private LifecycleOwner lifecycleOwner;
MutableLiveData<Boolean> mutableLiveData = new MutableLiveData(); //Live data to be observed from viewModel
@Mock
private Lifecycle lifecycle;

    @Before
    public void setup() {
        lifecycleOwner = getLifecycleOwner();
PowerMockito.when(lifecycle.getCurrentState()).thenReturn(Lifecycle.State.CREATED);
    }


 @Test
    public void test() {

        mutableLiveData.observe(lifecycleOwner, new Observer<Boolean>() {
            @Override
            public void onChanged(@Nullable Boolean aBoolean) {
                assertTrue(aBoolean);
            }
        });
        mutableLiveData.postValue(true);
    }


private LifecycleOwner getLifecycleOwner() {
        return new LifecycleOwner() {
            @NonNull
            @Override
            public Lifecycle getLifecycle() {
                return lifecycle;
            }
        };
    }
0 голосов
/ 13 марта 2019

Я решаю эту проблему следующим образом:

  1. Получите LiveData и подпишитесь на него у нас-наблюдателя.
  2. Вызовите метод, который должен изменить LiveData внутри ViewModel.
  3. Убедитесь, что наш фиктивный наблюдатель получил обновленные данные.
  4. Убедитесь, что больше не было изменений этого наблюдателя.
  5. Убедитесь, что если мы повторно подпишем этого наблюдателя на том же LiveData, то мы не получим данные

См. Код ниже:

@RunWith(MockitoJUnitRunner.class)
public class SomeFeatureViewModelTest {

    private SomeFeatureViewModel mSomeFeatureViewModel;

    // Rule for help testing. Just trust me you need it :)
    @Rule
    public InstantTaskExecutorRule mRule = new InstantTaskExecutorRule();

    @Mock
    private Observer<Void> mOnClickButtonEventObserver;

    @Before
    public void setup() {
        mSomeFeatureViewModel = new SomeFeatureViewModel();
    }

    @Test
    public void clickOnNextScreenButton() {

        // get LiveData and subscribe our observer to it:
        mSomeFeatureViewModel.getOnClickButtonEvent().observeForever(mOnClickButtonEventObserver);

        // call the method that should change the LiveData inside the ViewModel:
        mSomeFeatureViewModel.clickOnNextScreenButton();

        // check that our observer received the updated data:
        verify(mOnClickButtonEventObserver).onChanged(null);

        // check that there were no more changes of this observer:
        verifyNoMoreInteractions(mOnClickButtonEventObserver);

        // check that if we re-subscribe this observer on the same LiveData then we do not receive data:
        mSomeFeatureViewModel.getOnClickButtonEvent().observeForever(mOnClickButtonEventObserver);
        verifyNoMoreInteractions(mOnClickButtonEventObserver);

    }

}
0 голосов
/ 06 марта 2019

Если вы хотите проверить, было ли всплывающее окно или нет, вы можете использовать Robolectric.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...