Я использовал шпиона для того же упражнения:
http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#13
Я изменил свой макет SniperListener в шпиона таким образом:
private final SniperListener sniperListenerSpy = spy(new SniperListenerStub());
private final AuctionSniper sniper = new AuctionSniper(auction, sniperListenerSpy);
А также создал заглушенную реализацию SniperListener:
private class SniperListenerStub implements SniperListener {
@Override
public void sniperLost() {
}
@Override
public void sniperBidding() {
sniperState = SniperState.bidding;
}
@Override
public void sniperWinning() {
}
}
Книга использует "Состояния" JMock'а, но вместо этого я использовал вложенное перечисление:
private SniperState sniperState = SniperState.idle;
private enum SniperState {
idle, winning, bidding
}
Затем вы должны использовать обычные утверждения JUnit для проверки состояния:
@Test
public void reportsLostIfAuctionClosesWhenBidding() {
sniper.currentPrice(123, 45, PriceSource.FromOtherBidder);
sniper.auctionClosed();
verify(sniperListenerSpy, atLeastOnce()).sniperLost();
assertEquals(SniperState.bidding, sniperState);
}