2.1 @Mock-Annotation

Es gibt zwei Möglichkeiten, in Mockito mit Scheinobjekten zu arbeiten. Die erste besteht darin , ein vollständig virtuelles Objekt zu erstellen , die zweite darin, ein vorhandenes Objekt in einen Wrapper einzuschließen. Beginnen wir mit dem ersten.

Um ein vollständig virtuelles Objekt zu erstellen, müssen Sie den Code schreiben:

ClassName variable name = Mockito.mock(ClassName.class);

Lassen Sie uns als Beispiel eine Schein-ArrayList-Klasse erstellen:

@ExtendWith(MockitoExtension.class)
class MockTest {
    @Test
    public void whenNotUseMockAnnotation_thenCorrect() {
        List mockList = Mockito.mock(ArrayList.class);
        //these methods won't do anything - they are stubs
        mockList.add("one");
        mockList.add("two");
    }
}

In diesem Beispiel erstellen wir eine gefälschte ArrayList und speichern einen Verweis darauf in der Variable „mockList“. Die Methoden dieses Objekts bewirken nichts.

Dieser Code kann übrigens noch kürzer geschrieben werden, da es hierfür eine spezielle Annotation gibt @Mock.

@ExtendWith(MockitoExtension.class)
class MockTest {
    @Mock
    List mockList;

    @Test
    public void whenNotUseMockAnnotation_thenCorrect() {
        //these methods won't do anything - they are stubs
        mockList.add("one");
        mockList.add("two");
    }
}

Im zweiten Fall MockitoExtensionanalysiert es den Klassencode selbst und erstellt die erforderlichen Stubs. Sie müssen die Methode nicht aufrufen Mockito.mock(). Eine Anmerkung und das virtuelle Objekt ist fertig. Schönheit.

2.2 @Spy-Annotation

Der zweite wichtige Objekttyp in Mockito sind Wrapper über vorhandene Objekte. Sie ermöglichen einerseits die Nutzung bestehender Klassen und andererseits das Abfangen von Aufrufen aller Methoden und Variablen solcher Objekte: um deren Arbeit bei Bedarf zu korrigieren. Sie werden genauso häufig verwendet wie Scheinobjekte.

Um einen Wrapper für ein Objekt zu erstellen, müssen Sie den Code schreiben:

ClassName variable name = Mockito.spy(an object);

Ein Beispiel mit einem Wrapper um die ArrayList-Klasse:

@ExtendWith(MockitoExtension.class)
class SpyTest {
    @Test
    public void whenMockAnnotation() {
        List<String> mockList = Mockito.spy(new ArrayList<String>());
        //these methods will work!
        mockList.add("one");
        mockList.add("two");
    }
}

In seiner einfachsten Form leitet ein Aufruf eines Wrapper-Objekts einfach Aufrufe an das ursprüngliche Objekt um, dessen Referenz es in sich behält . Alles wird genauso funktionieren wie beim Originalobjekt.

Sie können einen Wrapper auch mit der Annotation - erstellen @Spy.

@ExtendWith(MockitoExtension.class)
class SpyTest {
    @Spy
    List mockList = new ArrayList<String>();

    @Test
    public void whenMockAnnotation() {
        // these methods will work!
        mockList.add("one");
        mockList.add("two");
    }
}

Diese beiden Codebeispiele sind gleichwertig.