Mic*_*uff 11 java testing mocking jmock mockito
增长面向对象软件这本书在jMock中给出了几个例子,其中状态是明确的,而不是通过API公开它.我真的喜欢这个主意.在Mockito有办法做到这一点吗?
这是本书的一个例子
public class SniperLauncherTest {
private final States auctionState = context.states("auction state")
.startsAs("not joined");
@Test public void addsNewSniperToCollectorAndThenJoinsAuction() {
final String itemId = "item 123";
context.checking(new Expectations() {{
allowing(auctionHouse).auctionFor(itemId); will(returnValue(auction));
oneOf(sniperCollector).addSniper(with(sniperForItem(item)));
when(auctionState.is("not joined"));
oneOf(auction).addAuctionEventListener(with(sniperForItem(itemId)));
when(auctionState.is("not joined"));
one(auction).join(); then(auctionState.is("joined"));
}});
launcher.joinAuction(itemId);
}
}
Run Code Online (Sandbox Code Playgroud)
我使用间谍进行同样的练习:
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);
Run Code Online (Sandbox Code Playgroud)
并且还创建了SniperListener的存根实现:
private class SniperListenerStub implements SniperListener {
@Override
public void sniperLost() {
}
@Override
public void sniperBidding() {
sniperState = SniperState.bidding;
}
@Override
public void sniperWinning() {
}
}
Run Code Online (Sandbox Code Playgroud)
本书使用了JMock的"States",但我使用了嵌套枚举:
private SniperState sniperState = SniperState.idle;
private enum SniperState {
idle, winning, bidding
}
Run Code Online (Sandbox Code Playgroud)
然后,您必须使用常规JUnit断言来测试状态:
@Test
public void reportsLostIfAuctionClosesWhenBidding() {
sniper.currentPrice(123, 45, PriceSource.FromOtherBidder);
sniper.auctionClosed();
verify(sniperListenerSpy, atLeastOnce()).sniperLost();
assertEquals(SniperState.bidding, sniperState);
}
Run Code Online (Sandbox Code Playgroud)