2012-01-06 2 views
23

同じクラスの他のメソッドを呼び出すいくつかのメソッドをテストしたい。これは基本的に同じメソッドですが、データベースにはいくつかのデフォルト値があるため、引数が少なくなります。私はこの方法getPriceForOne()メソッド呼び出しのgetPrice(int型)と呼ばれていたのであれば、私はテストをしたい、このメソッドが同じクラスの他のメソッドから呼び出されたかどうかを確認する方法mockito

public class A{ 
    Integer quantity; 
    Integer price;   

    A(Integer q, Integer v){ 
     this quantity = q; 
     this.price = p; 
    } 

    public Float getPriceForOne(){ 
     return price/quantity; 
    } 

    public Float getPrice(int quantity){ 
     return getPriceForOne()*quantity; 
    } 
} 

に表示されます。基本的には、通常のメソッドgetPrice(int)とモックgetPriceForOneを呼び出します。

import static org.mockito.Mockito.times; 
import static org.mockito.Mockito.verify; 
.... 

public class MyTests { 
    A mockedA = createMockA(); 

    @Test 
    public void getPriceTest(){ 
     A a = new A(3,15); 
     ... test logic of method without mock ... 

     mockedA.getPrice(2); 
     verify(mockedA, times(1)).getPriceForOne(); 
    } 
} 

私はもっと複雑なファイルを持っています。他の人には便利なユーティリティであり、すべてが1つのファイルでなければなりません。

+0

何が欲しいのは、部分的モックですが、推奨されていない、Mockitoは、実際にいくつかの特定の例は例外でこれを阻止します。ユーティリティクラスの場合は、各メソッドを完全にテストするだけです。そうでない場合、つまり複雑な処理が必要な場合は、代わりに合成を使用してコードを設計することができます。 – Brice

答えて

38

あなたはスパイが必要になり、モックAではない:

A a = Mockito.spy(new A(1,1)); 
    a.getPrice(2); 
    verify(a, times(1)).getPriceForOne(); 
+0

** getPriceForOne **には何らかの任意のパラメータがあると思われますか? –

+0

これで 'getPriceForOne'のパラメータとして' any(YourObject.class) 'を追加するだけです – TormundThunderfist

+0

これは正しいことです。同じ時間に、あなたの 'spyed'クラスにプライベート変数が設定されている場合、Whitebox.setInternalState()メソッドを使用してそのクラスにも設定する必要があります。 – udayanga

関連する問題