2011-07-03 8 views
10

成長オブジェクト指向ソフトウェアは、状態が明示的にAPIを介して公開されていないjMockのいくつかの例を示しています。私はこの考えが本当に好きです。 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

は、私は自分と同じ運動のためにスパイを使用

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

この方法は、他の答えよりもきれいです。 +1 –

+1

この本で使用されているjMockよりも優れています(これは素晴らしいですが、いくつかの欠陥があります)。彼らはテストコードを理解しやすくする必要性を常に強調していますが、その観点から、とにかく私の初心者の視点から判断すると、Mockitoははるかに優れているようです。 –

+1

しかし、 'SniperState'は残念なことに名前の選択です...本書では、SniperStateクラスをpに導入しているためです。 154(それは単純な 'enum'ではありません)... –

7

ないから、一例です。私は遠くのmockitoを使用していて、ドコモには、JMockサイトで状態について読むものと似たものはありません。私が正しくそれを持っていれば、彼らは基本的に、別のオブジェクトの特定の状態の期間にexepectionが発生する可能性のある時間を制限します。興味深い考えですが、私はそのアプリケーションを見るのに苦労しています。

Mockitoでは、同じジョブを実行するためにStubbing with callbacksを使用してコードを実行できます。コールバックメソッドでは、さらに状態の検証を実行できます。また、通話時にも実行されるので、Custom argument matcherを使用することもできます。

これらの両方を使用すると、実行時に状態をチェックする時間であるコードにアクセスできます。私はこのようにスパイに私SniperListenerのモックを変更

http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#13

関連する問題