【问题标题】:How to Mock Custom Jackson Deserializer Response in Spring Boot 1.5.9如何在 Spring Boot 1.5.9 中模拟自定义 Jackson 反序列化器响应
【发布时间】:2018-05-19 04:32:04
【问题描述】:

在 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 知识之外被调用(可能是newed up)。

有什么方法可以模拟自定义反序列化器,还是我需要通过@SpringBootTest 提升这个类以使用完整的 ApplicationContext 并让它完全执行?

【问题讨论】:

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


    【解决方案1】:

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

    否则,我假设 Jackson 每次都会实例化您的类的一个新实例,而根本不会使用您的模拟(或 bean?)。

    【讨论】:

    • 不幸的是,在 setUp 方法中注册反序列化器并使用该映射器时,我仍然遇到相同的错误。 This article 建议不必添加通过 @JsonDeserialize() 指定的反序列化器,这让我想知道您是否不能这么容易地覆盖它。
    • 也许尝试删除类上的注释? Jackson 应该从注册中知道您的反序列化器处理什么类。
    猜你喜欢
    • 2017-08-10
    • 1970-01-01
    • 2019-04-19
    • 2020-09-22
    • 2017-02-14
    • 2021-11-07
    • 2023-04-10
    • 2021-11-27
    • 2016-02-13
    相关资源
    最近更新 更多