Mockito: как разблокировать метод?

У меня есть класс JUnit с различными методами для выполнения различных тестов.

Я использую Mockito, чтобы создать шпион в реальном экземпляре, а затем переопределить какой-либо метод, который не имеет отношения к фактическому тесту, который я выполняю.

Есть ли способ, только для того, чтобы очистить меня после того, как некоторые другие тесты, которые запускаются после моих тестов, также используют одни и те же экземпляры и могут выполнять издевательский метод, который они не просили насмехаться, метод?

Скажем, у меня есть объект-шпион, называемый 'wareHouseSpy'

Скажем, я переопределяю метод isSomethingMissing:

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

Каким будет правильный способ отмены переопределения и возврата к нормальному состоянию на шпионе. Затем сделайте следующее invocation isSomethingMissing для запуска реального метода?

что-то вроде

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

или, возможно,

Mockito.unmock(wareHouseSpy)

Кто знает? Я не мог найти ничего в этой области

Спасибо!

Ассаф

Ответ 1

Я думаю,

Mockito.reset(wareHouseSpy)

сделает это.

Ответ 2

Это зависит от того, тестируете ли вы TestNG или JUnit.

  • JUnit создает новый экземпляр для каждого метода тестирования. Вам в основном не нужно беспокоиться о перепродажах.
  • С TestNG вы должны reset макет с Mockito.reset(mockA, mockB, ...) в @BeforeMothod или @AfterMethod

Ответ 3

Предположим, что большинство ваших тестов используют острый ответ. Тогда у вас будет метод setUp(), который выглядит следующим образом:

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

Теперь позвольте сказать, что вы хотите отменить полученный ответ и использовать реальную реализацию в одном тесте:

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

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

Ответ 4

Возможно, я не следую, но когда у вас есть реальный объект real:

Object mySpy = spy(real);

Затем, чтобы "unspy" mySpy... просто используйте real.

Ответ 5

"Обычным" способом является повторное создание объектов в вашем методе "setUp". Однако, если у вас есть реальный объект, который по какой-то причине дорог, вы можете сделать что-то вроде этого:

public class MyTests {

  private 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
  ...
}

Ответ 6

Адресация этой части:

Есть ли способ, только для того, чтобы очистить меня после того, как некоторые другие тесты, которые запускаются после моих тестов, также используют одни и те же экземпляры и могут выполнять издевательский метод, который они не просили насмехаться, метод?

Если вы используете JUnit, самый чистый способ сделать это - использовать @Before и @After (другие фреймворки имеют эквиваленты) и воссоздать экземпляр и шпион, чтобы ни один тест не зависел от того, что вы сделали на любом другом тесте. Затем вы можете выполнить тестовую конфигурацию шпиона/макета внутри каждого теста. Если по какой-то причине вы не хотите воссоздать объект, вы можете воссоздать шпиона. В любом случае, каждый начинает со свежим шпионом каждый раз.