2011-07-03 52 views
10

這本書面向對象軟件在jMock中給出了幾個例子,其中狀態是明確的而不通過API暴露。我真的喜歡這個主意。有沒有辦法在Mockito中做到這一點?mockito是否與jMock的國家有相同的習慣用法?

下面是從書中

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); 
    } 
} 

回答

7

我使用的間諜爲自同樣的練習:

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); 
} 
+1

這種方式比其他答案清潔。 +1 –

+1

比本書中使用的jMock好得多(這很好,但有一些缺陷)。他們不斷強調需要使測試代碼容易掌握,但從這個角度來看,無論如何,從我的新手的角度來看,Mockito似乎遠優於其他人。 –

+1

然而,'SniperState'是名字的一個不幸的選擇......因爲這本書介紹了它自己的SniperState類。 154(它不是一個簡單的'enum')... –

7

不是我所知道的一個例子。我使用mockito的數量很大,doco中沒有任何內容類似於我在JMock網站上讀到的關於州的內容。如果我有它的正確性,他們基本上限制了可以發生的時間到另一個對象的特定狀態的持續時間。這是一個有趣的想法,但我很難看到它的應用程序。

在Mockito中,您可以使用Stubbing with callbacks執行代碼來完成相同的工作。在回調方法中,您可以執行狀態的進一步驗證。或者,您可以使用Custom argument matcher,因爲它們在通話時也被執行。

這兩個都可以讓您在執行時訪問代碼,這是您要檢查狀態的時間。

相關問題