У меня есть класс, который я не могу легко использовать для инъекции зависимостей из-за обязательной реализации интерфейса - в двух словах, по этой причине я буду использовать Whitebox, и моя проблема здесь не связана с дизайном, вместо этогоэто просто чтобы выяснить, как правильно "tearDown" поведение, вызванное Whitebox.Смирись со мной на секунду, я дам тебе больше подробностей - это основной фиктивный класс:
public class Dummy implements MandatoryInterface {
private static final Logger logger = Logger.getLogger(MethodHandles.lookup().lookupClass());
private final ObjectMapper mapper = new ObjectMapper();
@Override
public Object convertArgumentToJson(Object arg) {
if (arg != null) {
try {
return mapper.writeValueAsString(arg);
} catch (IOException e) {
// doSomething();
logger.error("Error tracking request", e);
}
}
return null;
}
}
Предположим, что я хочу осветить то, что происходит, если здесь происходит исключение, единственный способ, которым я вижуэто использовать Whitebox.setInternalState .Вот тест:
public class DummyTest {
private Dummy dummy = new Dummy();
@Test
public void testA() throws IOException {
final ObjectMapper mock = Mockito.mock(ObjectMapper.class);
Whitebox.setInternalState(dummy, "mapper", mock);
Mockito.when(mock.writeValueAsString(Mockito.any()))
.thenThrow(new IOException());
Assert.assertNull(dummy.convertArgumentToJson("testA"));
}
@Test
public void testB() {
Assert.assertNotNull(dummy.convertArgumentToJson("testB"));
}
}
Как видите, я не могу определить отображение в классе Dummy как статическое из-за Whitebox (он не будет работать).Сказав это, после выполнения testA () у нас есть маппер, который высмеивается:
Проблема в том, когдавыполнение testB Я больше не хочу издеваться - это должен быть старый экземплярный экземпляр ObjectMapper, изначально включенный в Dummy.Но то, что появляется:
Теперь мой вопрос:
Как правильно отменить
Whitebox.setInternalState(dummy, "mapper", mock);
PS: я подумал об использовании tearDown () следующим образом:
@AfterMethod
public void tearDown(){
Whitebox.setInternalState(dummy, "mapper", originalState);
}
Однако в этом сценарии мой питест (тест на мутацию) будет считать, что я не покрываю инициализацию ObjectMapper,Итак: есть ли способ просто отменить Whitebox для остальных тестов, не устанавливая вручную старый?
Извините за длинное описание и заранее спасибо.
С уважением,