web-dev-qa-db-ja.com

mockito:メソッドをアンモックする方法は?

さまざまなテストを実行するさまざまなメソッドを持つJUnitクラスがあります。

Mockitoを使用して実際のインスタンスにスパイを作成し、実行する実際のテストに関連しないいくつかのメソッドをオーバーライドします。

テスト後に実行される他のいくつかのテストも同じインスタンスを使用し、モックするように要求しなかったモックメソッドを実行してメソッドのモックを解除する場合に備えて、私を後片付けするための方法はありますか?

'wareHouseSpy'というスパイオブジェクトがあるとします

メソッドをオーバーライドしたと言いますisSomethingMissing

doReturn(false).when(wareHouseSpy).isSomethingMissing()

オーバーライドを解除してスパイで通常の状態に戻す正しい方法、つまりisSomethingMissingの次の呼び出しで実際のメソッドを実行する正しい方法?

何かのようなもの

doReturn(Mockito.RETURN_REAL_METHOD).when(wareHouseSpy).isSomethingSpy()

または多分

Mockito.unmock(wareHouseSpy)

知るか?そのエリアには何も見つかりませんでした

ありがとう!

アサフ

35
user1045740

おもう

Mockito.reset(wareHouseSpy)

それを行うでしょう。

43
Don Roby

ほとんどのテストでスタブ化された応答を使用するとします。次に、次のようなsetUp()メソッドがあります。

@Before
public void setUp() {
  wareHouseSpy = spy(realWarehouse);
  doReturn(false).when(wareHouseSpy).isSomethingMissing();
}

ここで、スタブ化された応答を元に戻し、実際の実装を1つのテストで使用するとします。

@Test
public void isSomethingMissing_useRealImplementation() {
  // Setup
  when(wareHouseSpy.isSomethingMissing()).thenCallRealMethod();

  // Test - Uses real implementation
  boolean result = wareHouseSpy.isSomethingMissing();
}
13
Mike Tran

TestNGとJUnitのどちらでテストするかによって異なります。

  • JUnitは、テストメソッドごとに自身の新しいインスタンスを作成します。基本的に、モックのリセットについて心配する必要はありません。
  • TestNGでは、_@BeforeMethod_または_@AfterMethod_のMockito.reset(mockA, mockB, ...)を使用してモックをリセットする必要があります
9
Brice

たぶん私はフォローしていませんが、実際のオブジェクトrealがある場合:

Object mySpy = spy(real);

次に、「nspy "mySpy... _realを使用します。

3

「通常の」方法は、「setUp」メソッドでインスタンスを再インスタンス化することです。ただし、なんらかの理由で構築にコストがかかる実際のオブジェクトがある場合は、次のようにすることができます。

public class MyTests {

  private static MyBigWarehouse realWarehouse = new MyBigWarehouse();
  private MyBigWarehouse warehouseSpy;

  @Before
  public void setUp() {
    warehouseSpy = spy(realWarehouse); // same real object - brand new spy!
    doReturn(false).when(wareHouseSpy).isSomethingMissing();
  }

  @Test
  ...

  @Test
  ...

  @Test
  ...
}
2
jhericks

この部分への具体的な対応:

テスト後に実行される他のいくつかのテストも同じインスタンスを使用し、モックするように要求しなかったモックメソッドを実行してメソッドのモックを解除する場合に備えて、私を後片付けするための方法はありますか?

JUnitを使用している場合、これを行う最もクリーンな方法は、@Beforeおよび@After(他のフレームワークには同等のものがあります)を使用し、インスタンスとスパイを再作成して、テストが依存しない、または影響を受けないようにすることです。あなたは他のどんなテストでもしました。次に、各テスト内でスパイ/モックのテスト固有の構成を行うことができます。何らかの理由でオブジェクトを再作成したくない場合は、スパイを再作成できます。いずれにせよ、誰もが毎回新鮮なスパイから始めます。

0