2

TestNG テスト ケースで具象クラスをモックしたいと考えています。クラスは次のようになります (簡略化された例)。

public class Example() {

  private MyHello myHello;

  public Example(MyHello myHello) {
    this.myHello = myHello;
  }

  public String doSomething() {
    return myHello.doSomethingElse();
  }
}

ここでExample、定義された値をモックで返します。

@BeforeMethod
public void setUp() {
  this.example = mock(Example.class);
  when(this.example.doSomething()).thenReturn("dummyValue");
}

これは非常に良さそうに見えますが、実際にはそうではありません。setup メソッドの最後の行は、 のインスタンスでメソッドを呼び出しますExample。このインスタンスはコンストラクターを介して取得しなかったためMyHello、setUp メソッドで NPE を取得します。

モックの作成中に を注入する方法MyHello、または Mockito が実際のインスタンスでメソッドを呼び出すことを禁止する方法はありますか?

編集

観察された動作の原因となった問題は、doSomething()メソッドが実際にはfinal. その問題を解決しようとしたとき、私はそれを見落としました。とにかく、これは mockito の既知の制限です。したがって、ファイナルを削除するか、そのクラスのインターフェイスを抽出します。

4

2 に答える 2

2

を使用doReturn("dummy").when(example).doSomething()してうまくいくかどうかを確認してください。

Mockito.doReturn

JavaDoc から:

when(Object) を使用できない場合は、まれに doReturn() を使用してください。when(Object) は、引数のタイプ セーフで読みやすい (特に連続した呼び出しをスタブ化する場合) ため、スタブ化には常に推奨されることに注意してください。

doReturn() が役立つまれなケースを次に示します。

  1. 実際のオブジェクトをスパイし、スパイで実際のメソッドを呼び出すと、副作用が生じる場合

    リスト list = new LinkedList();

    リストスパイ=スパイ(リスト);

    //不可能: 実際のメソッドが呼び出されるため、spy.get(0) は IndexOutOfBoundsException をスローします (リストはまだ空です) when(spy.get(0)).thenReturn("foo");

    // スタブには doReturn() を使用する必要があります: doReturn("foo").when(spy).get(0);

于 2012-11-20T11:50:16.407 に答える
0

You can benefit from spy keyword instead of mock.

As far as I'm concerned from the documentation of Mockito, you are able to make partial mock with spy.

For detailed explanation you can benefit from subject 13 in the doc of it.

于 2012-11-20T13:33:49.837 に答える