webentwicklung-frage-antwort-db.com.de

EasyMock-Methode für ungültig erklären

Ich versuche EasyMock zu verwenden, um eine Datenbankschnittstelle zu verspotten, damit ich die Geschäftslogik anhand einer Wrapping-Methode testen kann. Ich bin mit Methoden, die zurückkehren, in Ordnung gekommen, indem ich in meinem Setup meines Tests Folgendes verwendet habe.

DBMapper dbmapper = EasyMock.createMock(DBMapper.class);
userService.setDBMapper(dbmapper);        

dann laufe ich in meinem eigentlichen test

EasyMock.expect(dbmapper.getUser(userId1)).andReturn(mockUser1);
EasyMock.replay(dbmapper);
userService.getUser(userId1);

Dieser Service verbindet sich dann mit dem dbmapper und gibt das Objekt zurück (der Mapper wird mit Setter-Methoden injiziert)

Diese Art von Mocks scheint gut zu funktionieren. Allerdings, wenn ich versuche, einen Test für auszuführen

userService.addUser(newUser1);

Diese Methode ruft eine Void-Methode auf.

dbmapper.createUser(newUser);

Es ist diese Methode, bei der ich Probleme beim Verspotten habe. Ich habe folgendes versucht

EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);

da einige andere Beiträge/Fragen usw. darauf hindeuten, dass ich einen IlligalStateException: no last call on a mock available erhalte

Kann mich bitte jemand in die richtige Richtung weisen?

Vielen Dank im Voraus

29
FireEnigmaX

Du bist nah dran.

Sie müssen nur die Methode in Ihrem Mock aufrufen, bevor Sie expectLastCall() aufrufen.

Ihre Erwartung würde also so aussehen:

userService.addUser(newUser1);
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);

Dies funktioniert, weil sich das Mock-Objekt vor dem Aufruf von replay() im Aufnahmemodus befindet, sodass alle Aufrufe von replay() Methode wird aufgerufen.

Was ich gerne tue, um sicherzugehen, dass es offensichtlich ist, dass der Methodenaufruf für eine Erwartung ist, einen kleinen Kommentar wie diesen davor zu setzen:

/* expect */ userService.addUser(newUser1);
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);
34
Dan Temple

Dieses Problem tritt nicht auf, wenn Sie die 'Nice'-API verwenden:

DBMapper dbmapper = EasyMock.createNiceMock(DBMapper.class);

Es gibt zwei Arten von Mock-Strict und Nice. Der strenge Mock löst Assertion Error aus, wenn eine unerwartete Methode aufgerufen wird. Der Nice-Mock ermöglicht unerwartete Methodenaufrufe für den Mock.

Weitere Informationen finden Sie im offiziellen Dokument - http://easymock.org/user-guide.html#mocking-strict

13
RakeshK