java - mockito 是否具有与 jMock 的状态等效的成语?

标签 java testing mocking mockito jmock

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/

相关文章:

Java、正则表达式HasNext以空行开头,多平台支持

java - 如何检测Java中的换行符

android - 在 Espresso 中模拟一个对象

entity-framework - 如何模拟EntityFramework的IQueryable实现的局限性

java - 创建一个接受任何类型的 Arraylist 的函数?

java - 将 mysql 日期解析为 ZonedDateTime

android - Espresso 安卓测试

php - 来自测试方法正在使用的同一类的模拟方法

javascript - Protractor 无法在 ng-click 元素上使用 css 定位元素

python - 如何将 `msg` 传递给 unittest.mock 断言方法?