2016-09-09 19 views
2

今週Mockitoを使い始めましたが、@InjectMocksフィールドを理解するのに問題があります。@InjectMocks属性は、Mockitoのメソッドを呼び出すことはできません。

私はこのようなものですクラスAを持っている:

public class A { 

    public B b; 

    public C c; 

    public String string; 

} 

私はMockitoJUnitテストでそれを使用するとき、私はこのようにそれを呼び出す:

@RunWith(MockitoJUnitRunner.class) 
public class Test { 

    @Mock 
    B b; 

    @Mock 
    C c; 

    @InjectMocks 
    A a; 

    ... 

} 

が、私は設定したいです文字列属性!私はこのようにそれを試してみてください。

Mockito.when(a.getString()).thenReturn("STRING"); 

しかし、テストでは、例外がスローされます。

org.mockito.exceptions.misusing.MissingMethodInvocationException: を()がA」にする必要があり、引数を必要とするときメソッド呼び出しをモック 'と呼びます。例えば、 (mock.getArticles())when then return(articles);

1.最終的な/プライベート/ equals()/ hashCode()メソッドのいずれかをスタブします。これらのメソッドスタブされている/確認することはできません。 2. inside()ではモックでメソッドを呼び出さず、ほかのオブジェクトでメソッドを呼び出します。 3.擬似クラスの親はpublicではありません。モックエンジンの限界です。

このフィールドを設定するために他に何かできますか?

答えて

4

このフィールドを設定するために他に何かできますか?

はい、あなたも次のよう@Spyであなたのフィールドに注釈を付けることができます。

@Spy 
@InjectMocks 
A a; 

次に、あなたはそれが唯一の@InjectMocksでアノテートされたときに実際にMockito.when(a.getString()).thenReturn("STRING");

を行うことができるでしょう、Mockitoはしていませんそれを疑うと、デフォルトではAクラスの通常のインスタンスが作成され、Mockito.when()を使用することはできません。回避策として、Mockito@Spyを使用して部分的に偽装するよう依頼することができます。あなたはモックではなく、いくつかの他のオブジェクトのメソッドを呼び出すことはありません

(内側):あなたが実際に取得

例外がエラーメッセージに設けられたケース#2にあります。

+0

恐ろしい!私はなぜMockitoの例外のこの "答え"でそれをすることができないのか理解できませんでした。説明ありがとう。 – mhery

+1

これはうまくいくかもしれませんが、それはAPIの重大な誤用です。 OPが本当に望んだのは、 "文字列"もある値に設定された非モックインスタンスのAを作成することでした。このような非模倣値を注入することは、Mockitoが現在持っていない(私は思う)機能ですが、それは持つことができ、過去にすでに要求されていました。 –

関連する問題