Zum Hauptinhalt springen

Unit-Tests mit Mockito Mocks

Michael Hönnig
Autor
Michael Hönnig
Bis Herbst 2027 nur für Beratungsaufträge mit geringem Stundenumfang verfügbar – remote, auf Deutsch und Englisch.

In Unit-Tests werden immer wieder sogenannte Mock-Objekte benötigt, um zum vereinfachte Versionen der Objekte zu haben, mit dem der Test-Kandidat kommuniziert. Diese müssen aber zum einen sinnvoll auf Methoden-Aufrufe reagieren, so dass der Test-Kandidat überhaupt funktionieren kann. Und zum anderen muss teilweise geprüft werden, ob der Test-Kandidat an diesen Objekten bestimmte Methoden mit bestimmten Parametern gerufen hat.

Mit Mockito sieht ein solcher Unit-Test z.B. wie folgt aus:

import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import static org.mockito.Mockito.when;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Matchers.anyInt;

class TestCase {

    // "Model" könnte ein Interface sein, 
    // für das ein Mock-Objekt benötigt wird
    @Mock
    Model model; 

        @Before
    public void before() {
        // bezieht sich auf obige(s) @Mock
        MockitoAnnotations.initMocks(this); 

        @Test
        public void test() {
                // wenn model.getPeriod() gerufen wird, 
        // soll der Mock 15 zurück liefern
        when(model.getPeriod()).thenReturn(15);

                // wenn model.getDelay() mit irgend einem 
        // int-Paramter gerufen wird,
                // soll der Mock 1 zurück liefern
        when(model.getDelay(anyInt)).thenReturn(1);

                // wenn model.run(1) gerufen wird, 
        // soll der Mock 20 zurück liefern
        when(model.run(1)).thenReturn(20);

                // der eigentliche Test
                new TestKandidat(model).run(22);

                // sollte mindestens einmal 
        // mit irgendeinem Parameterwert 
        // aufgerufen worden sein
        verify(model, atLeast(1)).setPeriod(anyInt());

                // model.run(1) sollte genau einmal aufgerufen worden sein
        verify(model, times(1)).run(1);

                // mode.fail() sollte gar nicht aufgerufen worden sein
        verify(model, never()).fail();
}

Ein Vergleich von EasyMock mit Mockito findet sich hier und eine ausführlichere Dokumentation zu Mockito findet sich hier.

Mockito kann außerdem auch über Maven bezogen werden (ggf. auf neue Versionen achten):

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>1.8.0</version>
    </dependency>