web-dev-qa-db-fra.com

Les objets factices sont-ils réinitialisés pour chaque test?

J'utilise le framework Mockito pour créer des objets Mock dans mes tests JUnit. Chaque modèle sait quelles méthodes ont été utilisées, alors je peux écrire pendant mes tests

verify(myMock, atLeastOnce()).myMethod();

Je me demande si cette fausse connaissance interne de ce qu’elle a appelé persistera à travers mes tests? Si cela persiste, il est possible que je reçois des faux positifs en utilisant la même méthode verify dans deux tests.

Un exemple de code

@RunWith(MockitoJUnitRunner.class)
public class EmrActivitiesImplTest {

    @Mock private MyClass myMock;

    @Before
    public void setup() {
        when(myMock.myMethod()).thenReturn("hello");
    }

    @Test
    public void test1() {
        // ..some logic
        verify(myMock, atLeastOnce()).myMethod();
    }

    @Test
    public void test2() {
        // ..some other logic
        verify(myMock, atLeastOnce()).myMethod();
    }  
}

L'état fictif est maintenu - test2 réussira indépendamment de la méthode de vérification de test1

L'état fictif est réinitialisé - test2 échouera si myMock.myMethod () n'est pas appelé

24
Shane

JUnit crée une nouvelle instance de classe de test chaque fois qu'il exécute une nouvelle méthode de test et exécute la méthode @Before chaque fois qu'il crée une nouvelle classe de test. Vous pouvez facilement le tester

@Before
public void setup() {
        System.out.println("setup");
        when(myMock.myMethod()).thenReturn("hello");
}

Et MockitoJUnitRunner créera une nouvelle instance fictive MyMock pour chaque méthode de test.

26
Evgeniy Dorofeev
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

import static org.mockito.Mockito.*;

@RunWith(MockitoJUnitRunner.class)
public class sandbox {

    @Mock
    private MyClass myMock;

    @Before
    public void setup() {
        when(myMock.myMethod()).thenReturn("hello");
    }

    @Test
    public void test1() {
        myMock.myMethod();
        verify(myMock, times(1)).myMethod();
    }

    @Test
    public void test2() {
        myMock.myMethod();
        verify(myMock, times(1)).myMethod();
    }

}

Ça passe. Si l'état persiste, le deuxième test échouera. Si vous le corrigez, vous obtiendrez une nouvelle instance de l'objet simulé pour chaque test. 

15
Ørjan Johansen

Si vous ne faites qu'initialiser les objets Mock dans votre setup, vous pouvez fournir différentes fonctionnalités dans chaque test. Vous pouvez l'initialiser une fois et changer la façon dont ils agissent/attendent par test après cela.

0
Walls