it-swarm.com.de

Werden Scheinobjekte für jeden Test zurückgesetzt?

Ich verwende das Mockito-Framework , um in meinen JUnit-Tests Mock-Objekte zu erstellen. Jeder Mock weiß, welche Methoden dafür aufgerufen wurden, also kann ich während meiner Tests schreiben

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

Ich frage mich, ob dieses interne Scheinwissen über das, was es genannt hat, auch in meinen Tests bestehen bleibt? Wenn dies fortbesteht, könnte ich bei Verwendung derselben verify-Methode in zwei Tests falsch positive Ergebnisse erhalten.

Ein Codebeispiel

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

Der Mock-Status bleibt erhalten - test2 wird trotzdem bestanden, da die Prüfmethode von test1 bestanden hat

Der Mock-Status wird zurückgesetzt - test2 schlägt fehl, wenn myMock.myMethod () nicht aufgerufen wird

24
Shane

JUnit erstellt bei jeder Ausführung einer neuen Testmethode eine neue Instanz der Testklasse und bei jeder neuen Testklasse die Methode @Before. Sie können es einfach testen

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

MockitoJUnitRunner erstellt für jede Testmethode eine neue MyMock-Mock-Instanz

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

}

Das geht vorbei. Wenn der Zustand bestehen blieb, würde der zweite Test fehlschlagen. Wenn Sie es debuggen, haben Sie für jeden Test eine neue Instanz des gespielten Objekts. 

15
Ørjan Johansen

Wenn Sie nur die Mock-Objekte in Ihrer setup initialisieren, können Sie in jedem Test unterschiedliche Funktionen bereitstellen. Sie können sie einmal initialisieren und danach ändern, wie sie sich pro Test verhalten/erwarten.

0
Walls