2011-09-28 9 views
9

私は自分自身を教えようと苦労しています。Mockito "when" problem

は本当に思考の私の方法で実行するべきではない以下のような方法、hasInventory()を、考えてみましょう、しかし私のようにかご形に私のテストを返すように設定します。クラス倉庫は私の "嘲笑依存"です。 JUnitテストコードで

public class Warehouse implements IWarehouse 
{ 
    private Map< String, Integer > inventory; 

    public Warehouse() 
    { 
    this.inventory = new HashMap< String, Integer >(); 
    } 

    public final boolean hasInventory(String itemname, int quantity) 
     throws InventoryDoesNotExistException 
    { 
    if(inventory == null) 
     throw new InventoryDoesNotExistException(); 

    if(!inventory.containsKey(itemname)) 
     return false; 

    int current = (inventory.containsKey(itemname)) ? inventory.get(itemname) : 0; 

    return(current >= quantity); 
    } 
    ... 

、最初()は文字通りメソッド呼び出し(これを実行する)と、在庫はゼロである(上記参照)を解釈するためInventoryDoesNotExistExceptionは、例外をスロースローされる。嘲笑依存性のクラスの他の方法はアドオン()のremove()のように、あまりにもあります。

@RunWith(MockitoJUnitRunner.class) 
public class OrderInteractionTest 
{ 
    private static final String TALISKER = "Talisker"; 
    private Order systemUnderTest = null; 

    @Mock 
    private Warehouse mockedDependency = null; 

    @Before 
    public void init() 
    { 
    //MockitoAnnotations.initMocks(this); 
    //mockedDependency = mock(Warehouse.class); 
    this.systemUnderTest = new Order(TALISKER, 50); 
    } 

    @Test 
    public void testFillingRemovesInventoryIfInStock() 
    { 
    try 
    { 
     doNothing().doThrow(new RuntimeException()).when(mockedDependency).add(anyString(), anyInt()); 
     doNothing().doThrow(new RuntimeException()).when(mockedDependency).remove(anyString(), anyInt()); 
     when(mockedDependency.hasInventory(anyString(), anyInt())).thenReturn(true); 
     when(mockedDependency.getInventory(anyString())).thenReturn(50); 

私はとき(で、それを理解したよう)方法、私は正確にhasInventory()を呼び出すことではないが、それは私のテストと呼ばれていたときにだけではなく、を返すようにMockitoを求めていますクラス( "systemUnderTest")。誰もが私はこのポイントを過ぎて(または私の脳にいくつかの意味を得る)助けることができますか?

私はmockito-すべて-1.8.5.jarとJUnitこれを読んですべての人に4

多量の感謝をリンクしています。

ラス

答えて

10

Mockitoはfinalクラスやメソッドを模擬することはできません。 hasInventoryメソッドからfinal修飾子を削除してみます。いっそ、代わりにその方法finalすることはできませんが、おそらくOrderで使用されるものを定義IWarehouseインターフェイスを、モック、Warehouseクラスをモックません。一般に

、それがインターフェイスを模擬することが好ましいが、それは必須ではありません。

モックイトFAQでは、finalのクラスまたはメソッドをモックできません。これは、モックイトの作成に使用されるランタイムクラス生成テクニックによるものです。

+0

ハ!はい、それは問題です。実際、私は今日これについて何かを読んでいますが、私は接続しませんでした。他のチュートリアルを模倣して、私はIWarehouseを模擬し始めていたので、それは動作していたので、私はインターフェイスをモックできたと思った(私は単純なクラスを模擬できると言った数週間前に誰かに話していたので、私は多くの現実のシナリオで考えて以来、インターフェイスを模擬するために、私はインターフェイスを持っていないだろう)。しかし、これは正解です!これはありがとうございます。 –