我想编写一个单元测试来测试JsonProcessingException。此异常可能发生在以下行:mapper.writeValueAsString()。
public void myMethod(Args...) {
try {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
Document.parse(mapper.writeValueAsString(testObject)));
}
} catch (JsonProcessingException e) {
log.error("Error parsing the object to json string. ", e);
}
}
这是我的单元测试:
public class Test {
@Mock
private ObjectMapper mapper;
@InjectMocks
ClassUnderTest sut;
@Test
public void testJsonProcessingException() throws JsonProcessingException {
when(mapper.writeValueAsString(Mockito.any())).thenThrow(new JsonProcessingException("Error parsing the object to json string. "){
private static final long serialVersionUID = 1L;});
sut.myMethod(args...);
}
}
问题是我已经模拟的映射器将不会被使用(我得到不必要的Mockito stubbings失败),因为mapper在方法内再次初始化。我如何使用mockito对这种情况进行单元测试?
答案 0 :(得分:2)
mapper
不是被测实例的字段/依赖项
它是在方法中创建的局部变量:
public void myMethod() {
try {
ObjectMapper mapper = new ObjectMapper();
...
}
所以,@InjectMocks
将无助。
我可以为您提出两种选择:
1)您可以通过更改方法的签名来传递mapper
作为参数:
public void myMethod(ObjectMapper mapper) {
...
}
通过这种方式,您可以将模拟的ObjectMapper
作为测试方法的参数传递。
如果经常调用此方法,则传递样板参数可能会令人讨厌并使代码的可读性降低。
2)另一种方法是提供一种通过被测试类的构造函数设置ObjectMapper
的方法。
public class ClassUnderTest{
private ObjectMapper objectMapper;
...
public ClassUnderTest(ObjectMapper objectMapper){
this.objectMapper = objectMapper;
}
...
}