在 Spring Boot 1.5.9 项目中,我目前正在尝试使用@WebMvcTest
对我的一个控制器运行测试。正在操作的实体在其属性之一上具有指向自定义类的@JsonDeserializer()
注释。我试图在不调用正文的情况下模拟测试中deserialize()
调用的结果。
但是,在尝试执行以下操作时,我在deserialize()
方法中的一行上收到 NullPointerException 错误,这表明正在执行实际的方法主体:
@Autowired
private MockMvc mvc;
@MockBean
private MyDeserializer myDeserializer
[...]
@Test
public void myTestMethod() {
doReturn(myDeserializedValue)
.when(myDeserializer)
.deserialize(
any(JsonParser.class),
any(DeserializationContext.class)
);
this.mvc.perform([...]) // perform mvc call that would invoke myDeserializer
logger.debug("Call complete"); // never gets to this line
}
我假设自定义反序列化程序类是在 Spring 的应用程序上下文知识之外被调用(可能new
编辑的(。
有没有办法模拟自定义反序列化程序,或者我是否需要通过@SpringBootTest
提升这个类以使用完整的应用程序上下文并让它完全执行?
如果您希望 Jackson 使用特定的反序列化程序对象实例,则需要通过 ObjectMapper 实例上的模块注册它。有关序列化程序的示例,请参阅文档;您必须为反序列化程序稍微修改它。
否则,我假设杰克逊每次都会实例化你的类的新实例,并且根本不使用你的模拟(或豆子?(。