JsonProcessingException的单元测试

时间:2017-09-15 15:04:00

标签: java json unit-testing mocking mockito

我想编写一个单元测试来测试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对这种情况进行单元测试?

1 个答案:

答案 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;
  }
  ...
}