3

Mockito を使用して、出力を検証できるようにクラスのプロパティをモックしたい

public class MyClass extends ThirdPartyFramework {
  Output goesHere;

  @Override
  protected setup(){
    goesHere = new Output();
  }

  //...      
}

public abstract class ThirdPartyFramework {
  protected setup(){...}
  //...
}

コードが正しい出力を書き込んだことを検証できるように、Output クラスのモックを挿入する必要があります。

  • しかし、メソッドが実行時に呼び出され、インジェクションを上書きするという@InjectMock理由だけではできません。setup()

  • MyClassまた、使用しているテスト コードは一般的であり、 のすべてのサブクラスで動作する必要があるため、 ThirdPartyFrameworkセットアップを公開することはできませThirdPartyFrameworksetup()

4

3 に答える 3

1

あなたはMockitoに設定されていますか?Mockito FAQ Mockito FAQ は静的メソッドのモックをサポートしていないと述べているので、私は尋ねています。この場合、セットアップメソッドが実際の出力の代わりにモックを作成するために必要になると思います。

同様のシナリオで PowerMock を使用しました。

whenNew(NewInstanceClass.class).withArguments(any()).thenReturn(mockObject);

これは、NewInstanceClass が作成されるたびに、どのコンストラクター引数が使用され、誰がいつ NewInstanceClass を構築したかに関係なく、私の mockObject が返されることを示しています。

PowerMock のドキュメントでは、次の例も見つけました。

PowerMock.expectNew(NewInstanceClass.class).andReturn(mockObject)

実際には、Mockito にバインドされている場合でも使用できます。PowerMock には、Mockito がこの問題を正確に解決するためのヘルパーが含まれており、すべてのテストに Mockito を使用し、PowerMock を使用して構築オブジェクトをモックできます。このような:

whenNew(Output.class).withNoArguments().thenReturn(yourOutputMock);
于 2013-01-31T14:49:14.137 に答える
1

ThirdPartyFrameworkそのクラスをクラスと同じパッケージにラップして配置することで、これを解決しましたThirdPartyFramework

そうすれば、保護されたメソッドを Mockito でモックできます。次に、オブジェクト@InjectMockのモックを挿入し、そのモックを介してメソッド呼び出しを制御するために使用できました。Output

于 2013-01-31T17:22:44.467 に答える
0

「goesHere」のセッターを追加してから、setup() をチェックして、null の場合に gosHere の値のみを変更するのはどうですか。このようにして、オーバーライドされない値をテストに挿入できます。何かのようなもの:

protected void setGoesHere( Output output ){
    goesHere = output;
} 

@Override
protected void setup(){
    if(goesHere != null) goesHere = new Output();
}

お役に立てれば。

于 2013-01-31T14:40:49.133 に答える