如何在Spring Boot 1.5.9中模拟自定义Jackson Deserializer响应

时间:2018-05-19 04:32:04

标签: java spring-boot mockito spring-test-mvc jackson-databind

在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并让它完全执行?

1 个答案:

答案 0 :(得分:0)

如果您希望Jackson使用特定的反序列化器对象实例,则需要通过ObjectMapper实例上的模块注册它。有关序列化程序的示例,请参阅the docs;你必须为你的解串器稍微修改一下。

否则,我认为Jackson每次只会实例化一个新类的实例,而根本不会使用你的mock(或bean?)。