J'ai une variable SingleLiveEvent. En obtenant la réponse de l'API, je la publie. Mon rappel est appelé et une fenêtre contextuelle s'affiche.
Ma question est de savoir comment écrire un scénario de test pour vérification, si ma fenêtre contextuelle est affichée ou non.
Événement en direct:
@Test
public void updateApplicationStatus_AccountOverdrawn() {
viewModel.updateApplicationStatus("AMOUNT_PENDING");
assertNotNull(viewModel.getOnAccountOverDrawn()); //this line is of no use. Need to change this.
}
En cas de succès, j'appelle: p>
viewModel.getOnAccountOverDrawn().observe(this, aVoid -> onAccountOverDrawn());
Dans mon fragment, je l'enregistre en tant que
onAccountOverDrawn.post();
et dans onAccountOverDrawn () je suis montrant juste un popup.
Alors, comment vais-je écrire un cas de test pour ce scénario?
Cas de test actuel:
private SingleLiveEvent<Void> onAccountOverDrawn = new SingleLiveEvent<>();
3 Réponses :
Si vous voulez tester s'il y a eu une fenêtre pop-up ou non, vous pouvez utiliser Robolectric.
Si vous souhaitez tester les données en direct ont été observées ou non, vous pouvez utiliser le test suivant
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;
}
};
}
Je résous ce problème comme ceci:
Voir le code ci-dessous:
@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);
}
}
vous voulez donc tester si le SingleLiveEvent a été observé ou non?
En remarque: l'utilisation de
SingleLiveEventn'est pas recommandée. Consultez ce post pour une meilleure alternative: medium.com/androiddevelopers/...