Ответ 1
Я думаю,
Mockito.reset(wareHouseSpy)
сделает это.
У меня есть класс JUnit с различными методами для выполнения различных тестов.
Я использую Mockito, чтобы создать шпион в реальном экземпляре, а затем переопределить какой-либо метод, который не имеет отношения к фактическому тесту, который я выполняю.
Есть ли способ, только для того, чтобы очистить меня после того, как некоторые другие тесты, которые запускаются после моих тестов, также используют одни и те же экземпляры и могут выполнять издевательский метод, который они не просили насмехаться, метод?
Скажем, у меня есть объект-шпион, называемый 'wareHouseSpy'
Скажем, я переопределяю метод isSomethingMissing:
doReturn(false).when(wareHouseSpy).isSomethingMissing()
Каким будет правильный способ отмены переопределения и возврата к нормальному состоянию на шпионе. Затем сделайте следующее invocation isSomethingMissing для запуска реального метода?
что-то вроде
doReturn(Mockito.RETURN_REAL_METHOD).when(wareHouseSpy).isSomethingSpy()
или, возможно,
Mockito.unmock(wareHouseSpy)
Кто знает? Я не мог найти ничего в этой области
Спасибо!
Ассаф
Я думаю,
Mockito.reset(wareHouseSpy)
сделает это.
Это зависит от того, тестируете ли вы TestNG или JUnit.
Mockito.reset(mockA, mockB, ...)
в @BeforeMothod
или @AfterMethod
Предположим, что большинство ваших тестов используют острый ответ. Тогда у вас будет метод 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();
}
Возможно, я не следую, но когда у вас есть реальный объект real
:
Object mySpy = spy(real);
Затем, чтобы "unspy" mySpy
... просто используйте real
.
"Обычным" способом является повторное создание объектов в вашем методе "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
...
}
Адресация этой части:
Есть ли способ, только для того, чтобы очистить меня после того, как некоторые другие тесты, которые запускаются после моих тестов, также используют одни и те же экземпляры и могут выполнять издевательский метод, который они не просили насмехаться, метод?
Если вы используете JUnit, самый чистый способ сделать это - использовать @Before
и @After
(другие фреймворки имеют эквиваленты) и воссоздать экземпляр и шпион, чтобы ни один тест не зависел от того, что вы сделали на любом другом тесте. Затем вы можете выполнить тестовую конфигурацию шпиона/макета внутри каждого теста. Если по какой-то причине вы не хотите воссоздать объект, вы можете воссоздать шпиона. В любом случае, каждый начинает со свежим шпионом каждый раз.