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
SingleLiveEvent
n'est pas recommandée. Consultez ce post pour une meilleure alternative: medium.com/androiddevelopers/...