Отмена Whitebox.setInternalState в @AfterMethod без установки исходного состояния - PullRequest
0 голосов
/ 11 июня 2018

У меня есть класс, который я не могу легко использовать для инъекции зависимостей из-за обязательной реализации интерфейса - в двух словах, по этой причине я буду использовать 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 () у нас есть маппер, который высмеивается:

enter image description here

Проблема в том, когдавыполнение testB Я больше не хочу издеваться - это должен быть старый экземплярный экземпляр ObjectMapper, изначально включенный в Dummy.Но то, что появляется:

enter image description here

Теперь мой вопрос:

Как правильно отменить

 Whitebox.setInternalState(dummy, "mapper", mock);

PS: я подумал об использовании tearDown () следующим образом:

@AfterMethod
public void tearDown(){
    Whitebox.setInternalState(dummy, "mapper", originalState);
}

Однако в этом сценарии мой питест (тест на мутацию) будет считать, что я не покрываю инициализацию ObjectMapper,Итак: есть ли способ просто отменить Whitebox для остальных тестов, не устанавливая вручную старый?

Извините за длинное описание и заранее спасибо.

С уважением,

1 Ответ

0 голосов
/ 11 июня 2018

Извините, ребята, мне удалось его получить.

На всякий случай, если кто-то еще может столкнуться с тем же вопросом, ответ будет проще, чем я предполагал.

private static final String MAPPER_DESC = "mapper";
private ObjectMapper originalMapper;

@BeforeMethod
public void init() {
    MockitoAnnotations.initMocks(this);
     originalMapper = (ObjectMapper) Whitebox.getInternalState(converter, MAPPER_DESC);
}

@AfterMethod
public void tearDown() {
    Whitebox.setInternalState(converter, MAPPER_DESC, originalMapper);
}

Тогда testA и testB могут сохранять один и тот же код.И тест мутации все еще будет иметь объявление атрибута ObjectMapper, как показано на рисунке: enter image description here

...