Mockito: Lessons Learned

Ich möchte hier einige der Dinge sammeln, die mir bei der Arbeit mit Mockito immer wieder passieren oder Details, die ich mir merken möchte. Vielleicht hilft's ja auch Anderen ...

Typen-Definition bei der Deklaration von Methoden-Aufrufen

Beispielsweise bei verify() und when() muss angegeben werden, welche Parametertypen übergeben werden. Dies braucht Mockito, um die Methoden-Signatur zu erkennen. Ausserdem kann man statt einem Typ auch direkt einen Wert mitgeben. Dies ist zum Beispiel sinnvoll, wenn man einen Wert beim Aufruf der zu testenden Methode mitgibt, der unverändert an die gemockte, tieferliegende Schicht übergeben werden soll.

Beispiel 1:

Mockito.verify(fsDaoMock).setStatus(1L, 1L, Status.ACTIVE, CallerToken.USER);

Hier verwende ich konkrete Werte, um zu prüfen, ob genau dieser Aufruf gemacht wurde.

Beispiel 2:

Mockito.verify(fsDaoMock).setStatus(Mockito.anyLong(), Mockito.anyLong(), Mockito.any(Status.class), Mockito.any(CallerToken.class));

Hier verwende ich nur Typen und definiere jeweils keine Werte.

Wichtig: Wenn ich diese beiden Ansätze mischen will (also zum Teil konkrete Werte und beim Rest 'nur' Typen definieren), muss ich das so machen:

Mockito.verify(fsDaoMock).setStatus(Mockito.anyLong(), Mockito.anyLong(), Mockito.eq(Status.ACTIVE), Mockito.eq(CallerToken.USER));

Alles andere führt zu Laufzeit-Fehlern.

Mocking eines privaten Attributes unter Spring

Ich möchte eine Klasse testen, die über Dependency Injection (@AutoWired) ein DAO bekommt. Natürlich sollen die DAO-Methoden nicht aufgerufen werden.

Die Deklaration des DAO ist folgendermassen:

@Autowired private FileStoreDao fsDao;

Es wäre aus Architekturüberlegungen inakzeptabel direkten Zugriff auf fsDao zu gewähren (z.B. getter oder Aufweichen des Zugriffsmodifiers). Spring hat eine Util-Klasse, die in diesem Fall weiterhilft:

FileStoreServiceImpl fileStoreServiceImpl = new FileStoreServiceImpl(); FileStoreDao fileStoreDaoMock = Mockito.mock(FileStoreDao.class); ReflectionTestUtils.setField(fileStoreServiceImpl, "fsDao", fileStoreDaoMock);