我有一个类,由于接口的强制实现,我不能轻易地使用依赖项注入来模拟它--简而言之,由于这个原因,我将使用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"));
}
}正如您所看到的,我不能将虚拟类中的映射器定义为静态的,因为Whitebox (它不能工作)。尽管如此,在执行testA()之后,我们已经对映射器进行了模拟:

问题是:在执行testB时,我不再想要模拟了--它应该是最初包含在虚拟环境中的旧实例ObjectMapper。但出现的情况是:

现在,我的问题:
撤销的正确方法是什么
Whitebox.setInternalState(dummy, "mapper", mock);P.S.:我考虑过使用像这样的tearDown():
@AfterMethod
public void tearDown(){
Whitebox.setInternalState(dummy, "mapper", originalState);
}然而,在这个场景中,我最可怜的(突变测试)会认为我没有涉及ObjectMapper的初始化,那么:是否有一种方法可以在不手动设置旧测试的情况下为其余的测试撤消Whitebox?
很抱歉给您详细的描述,并提前感谢您。
致以敬意,
发布于 2018-06-11 09:33:50
抱歉,伙计们,我成功了。
万一其他人面临同样的问题,答案比我想象的要容易。
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属性声明,如图像所示:

https://stackoverflow.com/questions/50794077
复制相似问题