52

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

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

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

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

メソッドisSomethingMissingをオーバーライドしたとしましょう:

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

オーバーライドを解除し、スパイで物事を通常に戻す、つまり、実際のメソッドを実行するためにisSomethingMissingの次の呼び出しを行う正しい方法は何でしょうか。

何かのようなもの

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

または多分

Mockito.unmock(wareHouseSpy)

知るか?その地域には何も見つかりませんでした

ありがとう!

アサフ

4

7 に答える 7

53

おもう

Mockito.reset(wareHouseSpy)

それをするでしょう。

于 2011-11-14T14:43:33.167 に答える
18

テストのほとんどがスタブ化された応答を使用しているとしましょう。次に、次のような 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();
}
于 2016-02-16T00:46:00.257 に答える
11

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

  • JUnit は、テスト メソッドごとにそれ自体の新しいインスタンスを作成します。基本的に、モックのリセットについて心配する必要はありません。
  • TestNG では、またはMockito.reset(mockA, mockB, ...)いずれかでモックをリセットする必要があります。@BeforeMethod@AfterMethod
于 2011-11-14T19:50:18.163 に答える
4

「通常の」方法は、「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
  ...
}
于 2011-11-14T16:55:10.480 に答える
3

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

Object mySpy = spy(real);

次に、「unspy」にmySpy...使用するだけrealです。

于 2011-11-14T14:42:54.657 に答える
0

この作品に具体的に対処する:

私のテストの後に実行される他のテストも同じインスタンスを使用し、モックするように要求しなかったモックされたメソッドを実行する可能性がある場合に備えて、私の後にクリーンアップするためだけに、メソッドをモック解除する方法はありますか?

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

于 2011-11-14T16:01:12.627 に答える