Unit testing 在@AfterMethod中撤消Whitebox.setInternalState而不设置原始状态
我有一个类,由于接口的强制实现,我不能轻易地使用依赖注入来模拟它-简而言之,出于这个原因,我将使用Whitebox,我在这里关心的不是设计,而是如何正确地“撕裂”Whitebox引起的行为。请耐心等待,我将向您提供更多详细信息-这是主要的虚拟类: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
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属性声明,如图所示: