3
votes

Comment tester la variable SingleLiveEvent ?

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<>();


2 commentaires

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/...


3 Réponses :


-1
votes

Si vous voulez tester s'il y a eu une fenêtre pop-up ou non, vous pouvez utiliser Robolectric.


0 commentaires

0
votes

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;
            }
        };
    }


0 commentaires

1
votes

Je résous ce problème comme ceci:

  1. Obtenez LiveData et abonnez-vous à notre observateur simulé.
  2. Appelez la méthode qui devrait modifier les LiveData dans le ViewModel.
  3. Vérifiez que notre observateur fictif a bien reçu les données mises à jour.
  4. Vérifiez qu'il n'y a plus eu de modifications de ce simulacre d'observateur.
  5. Vérifiez que si nous réinscrivons ce faux-observateur sur le même LiveData, nous ne recevons pas de données

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);

    }

}


0 commentaires