【问题标题】:Jackson.InvalidDefinitionException: Cannot construct instance of java.time.OffsetDateTime in JUnit @BeforeEachJackson.InvalidDefinitionException:无法在 JUnit @BeforeEach 中构造 java.time.OffsetDateTime 的实例
【发布时间】:2020-07-27 05:55:31
【问题描述】:

我正在尝试为我的 Open-API 自动生成的代码创建单元测试用例。我有一个date-time 格式,它在 API 中运行良好,但在我尝试设置 JUnit 测试用例时失败

JUnit 设置代码:

@BeforeEach
public void setUp() throws IOException {
        MockitoAnnotations.initMocks(this);
        requestDTO = objectMapper.readValue(TestData.TEST_JSON, RequestDTO.class);
    }

TestData.TEST_JSON

public static String TEST_JSON= "{\n" +
            "  \"name\": \"credit_application\",\n" +
            "  \"comments\": {\n" +
            "    \"id\": \"1\",\n" +
            "    \"userId\": \"21212\",\n" +
            "    \"taskId\": \"212\",\n" +
            "    \"time\": \"2010-07-17T02:49:58.564Z\",\n" +
            "    \"comment\": \"Hello world\"\n" +
            "  },\n" +
            "  \"id\": \"123\",\n" +
            "  \"version\": \"1.0\"\n" +
            "}";

/*
{
  "name": "credit_application",
  "comments": {
    "id": "1",
    "userId": "21212",
    "taskId": "212",
    "time": "2010-07-17T02:49:58.564Z",
    "comment": "Hello world"
  },
  "id": "123",
  "version": "1.0"
}
*/

RequestDTO(Open-API 自动生成代码):

public class RequestDTO   {
  @JsonProperty("name")
  private String name;

  @JsonProperty("comments")
  private CommentDTO comments;

  @JsonProperty("id")
  private String id;

  // Constructors and Getters/Setters

}

CommentDTO(Open-API 自动生成代码):

public class CommentDTO   {
  @JsonProperty("id")
  private String id;

  @JsonProperty("userId")
  private String userId;

  @JsonProperty("taskId")
  private String taskId;

  @JsonProperty("time")
  private OffsetDateTime time;

  @JsonProperty("comment")
  private String comment;

  // Constructors and Getters/Setters
}

例外:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.OffsetDateTime` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('2020-07-27T02:49:58.564Z')

date-time 用于应用程序代码,但不适用于 Junit 设置代码。

【问题讨论】:

    标签: java datetime junit jackson openapi-generator


    【解决方案1】:

    你需要使用JavaTimeModule来配置ObjectMapper来处理Java DateTime API 使用:

    <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
            <version>2.9.10</version>
    </dependency>
    

    然后将模块注册到你的ObjectMapper

     ObjectMapper objectMapper = new ObjectMapper();
     objectMapper.registerModule(new JavaTimeModule());
     objectMapper.readValue(TestData.TEST_JSON, RequestDTO.class);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 2021-07-17
      • 2014-08-28
      • 2020-09-27
      • 2018-12-24
      • 2020-03-08
      相关资源
      最近更新 更多