我正在尝试使用PowerMock来缓存对Jackson ObjectMapper的调用,但由于某种原因它无法正常工作,我怀疑它与whenNew在实际被测试的方法中实例化时未实际提供模拟实例有关
这是我们无法真正改变的遗留代码库,因此我们不得不使用PowerMock来满足测试覆盖率要求......
我的方法类似于以下内容:
private void intakeDataFromUrl(URL url) {
ObjectMapper mapper = new ObjectMapper();
DataDTO[] dataDtos = mapper.readValue(url, DataDTO[].class)
// other code
}
在单元测试中,我试图执行以下操作:
@Test
public void test_intakeDataFromUrl() {
DataDTO[] data = this.createMockData();
ObjectMapper mapper = mock(ObjectMapper.clas);
whenNew(ObjectMapper.clas)
.withNoArguments()
.thenReturn(mapper);
// mock call to return mocked data
doReturn(data)
.when(mapper, "readValue", any(URL.class), any(DataDTO[].class))
}
但是在被测试的代码中,dataDtos总是为null,然后下一段代码总是失败。
编辑:
看起来这条线可能是个问题,尽管看看它应该有效的其他例子。
// mock call to return mocked data
doReturn(data)
.when(mapper, "readValue", any(URL.class), any(DataDTO[].class))
我也在最后一个参数上尝试了isA和eq而没有运气,仍然返回null。
答案 0 :(得分:2)
以下whenNew
与ObjectMapper
的使用可以成功运作:
@RunWith(PowerMockRunner.class)
@PrepareForTest({ObjectMapper.class})
public class WtfTest {
@Test
public void test_intakeDataFromUrl() throws Exception {
String in = "in";
String out = "out";
ObjectMapper mapper = mock(ObjectMapper.class);
PowerMockito.whenNew(ObjectMapper.class)
.withNoArguments()
.thenReturn(mapper);
Mockito.when(mapper.readValue(in, String.class)).thenReturn(out);
assertEquals(out, intakeDataFromUrl(in));
}
private String intakeDataFromUrl(String url) throws IOException {
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(url, String.class);
}
}
虽然此示例不使用DataDTO
,但它与您的示例一致且功能正常。