2016-05-31 20 views
0

でユニットテストでは、親クラスのメソッドを無視します。私はこの方法を無視するか、それをスタブしたいです。私は、以下のより少ないをしようとしている: 私は、私がテストをしてみてください次のクラス持っmockito

public class TestClassA{ 
    @Mock 
    ClassB instanceB; 

    public String testTheMethodToBeTested{ 
    doNothing().when(instanceB).methodB(); 
    ClassA instanceA = new ClassA(); 
    String result = instanceA.methodToBeTested(); 
    String expected = "foo" 
    assertTrue(result.equals(expected)); 
    } 
    ... 
} 

は、しかし、私は methodBはまだ実行されていることがわかります。しかし、 ClassAでは、classB変数を宣言してsetterを宣言すると、 methodB()の代わりに classB.methodB()と書くと、テストが実行されます。しかし、私はテストされるコードを変更しないように頼まれています。 ClassAをテストする方法はありますか?

+0

あなたは 'ClassB'のモックを作成し、次に' ClassA'のインスタンスを作成します...なぜあなたは 'ClassB'のモックが' ClassA'のインスタンスと関係があると思いますか? 'ClassA'と' doNothing()。when(instanceA).methodB(); 'を使ってスパイを作成するだけです。 – Tom

+0

私は単体テストとJavaに非常に新しいので、私は絶望のために何も奇跡を期待しませんでした。あなたがお勧めしたことを試してみましょう。どうもありがとう。 – newzad

+1

ヒント:あなたのコードは、継承よりも構成を好むべきであると多くの人々が主張している良い例です。あなたのクラスAが(それを拡張するのではなく)Bを含んでいたら、依存関係注入を使用してテスト用に擬似BオブジェクトをAに挿入することができ、Spyビジネスに入る必要はありません。私はあなたのデザインが本質的に間違っていると言っているわけではありません。しかし、おそらくあなたの同僚とそれを見直す価値があります。 – GhostCat

答えて

0

@Spyhttp://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#13)を使用できます。

public class TestClassA{ 

    @Rule 
    public MockitoRule rule = MockitoJUnit.rule(); 

    @Spy 
    ClassA instanceA; 

    public String testTheMethodToBeTested{ 
    doNothing().when(instanceA).methodB(); 
    String result = instanceA.methodToBeTested(); 
    String expected = "foo" 
    assertTrue(result.equals(expected)); 
    } 
    ... 
} 

あなたはので、相続のClassBのインスタンスをインスタンス化されていませんが、Mockitoはあなたがあまりにも実物をスパイすることができます。

+0

methodBはまだ実行中です。しかし、ありがとう。 – newzad

+0

'@ Rule'を忘れました、今追加しました。もう一度やり直せますか?同じサンプルが私のために働いています – ThanksForAllTheFish

+0

答えコードにinstanceAのコンストラクタコール( '@Spy ClassA instanceA = new ClassA();')がありません。または、アノテーションとルールを削除して、 'ClassA instanceA = Mockito.spy(new ClassA());' –