gpt4 book ai didi

java - JsonProcessingException 的单元测试

转载 作者:搜寻专家 更新时间:2023-11-01 03:17:05 26 4
gpt4 key购买 nike

我想编写一个单元测试来测试 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 stub 失败),因为映射器在方法内部再次初始化。我如何使用 mockito 对这种情况进行单元测试?

最佳答案

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

关于java - JsonProcessingException 的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46242612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com