13

本書Growing Object Oriented Softwareは、API を介して公開せずに状態を明示する jMock の例をいくつか示しています。私はこのアイデアがとても好きです。Mockitoでこれを行う方法はありますか?

これは本からの1つの例です

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

2 に答える 2

8

私は同じ練習のためにスパイを使いました:

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 の「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);
}
于 2014-02-26T16:44:59.630 に答える
7

私が知っているわけではありません。私はかなりの量のmockitoを使用しましたが、状態についてJMockサイトで読んだものと同様のドキュメントはありません。私が正しく持っていれば、基本的に、例外が発生する時間を別のオブジェクトの特定の状態の期間に制限します。興味深いアイデアですが、そのアプリケーションを見つけるのに苦労しています。

Mockito では、スタブとコールバックを使用してコードを実行し、同じジョブを実行できます。コールバック メソッドでは、状態のさらなる検証を実行できます。別の方法として、呼び出し時にも実行されるカスタム引数マッチャーを使用することもできます。

これらはどちらも、状態を確認したい実行時にコードにアクセスできます。

于 2011-07-03T23:54:40.153 に答える