Unit testing 在@AfterMethod中撤消Whitebox.setInternalState而不设置原始状态

Unit testing 在@AfterMethod中撤消Whitebox.setInternalState而不设置原始状态,unit-testing,mockito,white-box-testing,Unit Testing,Mockito,White Box Testing,我有一个类,由于接口的强制实现,我不能轻易地使用依赖注入来模拟它-简而言之,出于这个原因,我将使用Whitebox,我在这里关心的不是设计,而是如何正确地“撕裂”Whitebox引起的行为。请耐心等待,我将向您提供更多详细信息-这是主要的虚拟类: public class Dummy implements MandatoryInterface { private static final Logger logger = Logger.getLogger(MethodHandles.loo

我有一个类,由于接口的强制实现,我不能轻易地使用依赖注入来模拟它-简而言之,出于这个原因,我将使用Whitebox,我在这里关心的不是设计,而是如何正确地“撕裂”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"));
    }

}
如您所见,我无法将虚拟类中的映射器定义为静态的,因为白盒(它不起作用)。 话虽如此,在执行testA()之后,我们对映射程序进行了模拟:

问题是:当执行testB时,我不再需要mock——它应该是最初包含在Dummy中的旧实例化ObjectMapper。但出现的情况是:

现在,我的问题是:

什么是正确的方法来撤销

 Whitebox.setInternalState(dummy, "mapper", mock);
附言:我考虑过使用像这样的拆卸工具:

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

但是,在这个场景中,我的Pistest(突变测试)会考虑到我没有覆盖ObjistMaMatter的初始化,所以,有没有一种方法可以在不手动设置旧测试的情况下,为其余的测试撤销白皮书? 抱歉,描述太长,请提前感谢


问候,

对不起,伙计们,我设法得到了它

以防其他人也会面临同样的问题,答案比我想象的要简单

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属性声明,如图所示:

对不起,伙计们,我设法得到了它

以防其他人也会面临同样的问题,答案比我想象的要简单

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属性声明,如图所示: