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>
Twitter
Facebook
Reddit
LinkedIn
StumbleUpon
Email