在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的ApplicationContext知识之外调用自定义反序列化器类(可能是new
)。
有没有办法模拟自定义反序列化器,或者我是否需要通过@SpringBootTest
来使用完整的ApplicationContext并让它完全执行?
答案 0 :(得分:0)
如果您希望Jackson使用特定的反序列化器对象实例,则需要通过ObjectMapper实例上的模块注册它。有关序列化程序的示例,请参阅the docs;你必须为你的解串器稍微修改一下。
否则,我认为Jackson每次只会实例化一个新类的实例,而根本不会使用你的mock(或bean?)。