質問

私は現在、Mockitoを使用して、コントローラーの方法をテストするスプリングMVCアプリケーションでサービスレイヤーオブジェクトをmockしています。しかし、私はモキトの詳細について読んでいるので、私はその方法が doReturn(...).when(...) に相当します when(...).thenReturn(...). 。ですから、私の質問は、同じことをする2つの方法を持っていることのポイント、または微妙な違いは何ですか? doReturn(...).when(...)when(...).thenReturn(...)?

どんな助けも感謝します。

役に立ちましたか?

解決

スタブの2つの構文はほぼ同等です。ただし、できます いつも 使用する doReturn/when スタブ用;しかし、あなたがいる場合があります できません 使用する when/thenReturn. 。スタブボイドメソッドはそのようなものです。その他には、Mockito Spiesでの使用や同じ方法を複数回スタブすることが含まれます。

それが一つのこと when/thenReturn あなたに与えます、それ doReturn/when コンパイル時に、返品している値のタイプチェックではありません。ただし、これはほとんど価値がないと思います。タイプが間違っている場合、テストを実行するとすぐにわかります。

使用することを強くお勧めします doReturn/when. 。 2つの構文を学習することには、1つの構文を学習することには意味がありません。

あなたは私の答えをで参照したいかもしれません モキト「グラマー」の形成 - 非常に密接に関連する質問に対するより詳細な答え。

他のヒント

スパイされたオブジェクトを使用すると、両方のアプローチの動作が異なって動作します( @Spy)モックの代わりに(で注釈が付けられています @Mock):

  • when(...) thenReturn(...) 実際のメソッド呼び出しを行います 指定された値が返される直前。したがって、呼ばれるメソッドが例外をスローする場合、あなたはそれに対処する / ock笑する必要があります。もちろん、あなたはまだあなたの結果を得ることができます(あなたが定義するもの thenReturn(...))

  • doReturn(...) when(...) メソッドをまったく呼び出しません.

例:

public class MyClass {
     protected String methodToBeTested() {
           return anotherMethodInClass();
     }

     protected String anotherMethodInClass() {
          throw new NullPointerException();
     }
}

テスト:

@Spy
private MyClass myClass;

// ...

// would work fine
doReturn("test").when(myClass).anotherMethodInClass();

// would throw a NullPointerException
when(myClass.anotherMethodInClass()).thenReturn("test");

Mockito Javadocは、なぜ使用するのかを教えているようです doReturn() それ以外の when()Mockito.When(Object)を使用できないまれな機会にDoreturn()を使用します。

Mockito.(オブジェクト)が常にスタブに推奨されるときは、引数タイプセーフでより読みやすいため(特に連続した通話をスタブする場合)。

Doreturn()が便利になる珍しい機会は次のとおりです。

1. 実際のオブジェクトをスパイし、スパイに実際の方法を呼び出すと、副作用がもたらされます

List list = new LinkedList(); List spy = spy(list);

//不可能:実際の方法はsupy.get(0)と呼ばれます。

when(spy.get(0)).thenReturn("foo");

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

2. 以前の例外スタブをオーバーライドする:

when(mock.foo()).thenThrow(new RuntimeException());

//不可能:例外型のfoo()メソッドは、runtimeexceptionがスローされるように呼ばれます。 when(mock.foo()).thenReturn("bar");

//スタブにはdoreturn()を使用する必要があります。

doReturn("bar").when(mock).foo(); 上記のシナリオは、Mockitoのエレガントな構文のトレードオフを示しています。ただし、シナリオは非常にまれであることに注意してください。スパイは散発的である必要があり、例外を最優先することは非常にまれです。言うまでもなく、一般的にはスタブのオーバードリングは、あまりにも多くのスタブを指摘する潜在的なコードの匂いです。

継続 この答え, 、たとえば、最初の時間と呼ばれるとき、2回目の呼び出しなど、さまざまな値を返したい場合、例えば値を渡すことができるという別の違いがあります。

PowerMockito.doReturn(false, false, true).when(SomeClass.class, "SomeMethod", Matchers.any(SomeClass.class));

したがって、メソッドが同じテストケースで呼び出されるとfalseを返し、その後再びfalseを返し、最後に真実に戻ります。

後者の代替品は、戻るモックの方法に使用されます void.

たとえば、こちらをご覧ください:Mockitoを使用してボイドメソッドにモックする方法

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top