Growing Object Oriented Software 一书在 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);
}
}
最佳答案
我用了一个 spy 来做同样的练习:
http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#13
我将我的 SniperListener mock 变成了 spy :
private final SniperListener sniperListenerSpy = spy(new SniperListenerStub());
private final AuctionSniper sniper = new AuctionSniper(auction, sniperListenerSpy);
并且还创建了 SniperListener 的 stub 实现:
private class SniperListenerStub implements SniperListener {
@Override
public void sniperLost() {
}
@Override
public void sniperBidding() {
sniperState = SniperState.bidding;
}
@Override
public void sniperWinning() {
}
}
这本书使用了 JMock 的“States”,但我使用了一个嵌套的枚举:
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);
}
关于java - mockito 是否具有与 jMock 的状态等效的成语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6565971/