簡體   English   中英

傑克遜(反)序列化在 HTTP 響應和測試用例之間不准確

[英]Jackson (de)serialization not accurate between HTTP responses and test cases

我有一個 Spring Boot 2.3.2.RELEASE WebFlux 應用程序。 我有一些 JPA 實體作為 RESTful API 響應的一部分返回。

我進行的測試(使用@WebFluxTest )根據 JSON 模式檢查 HTTP 響應和合同。 我在這些測試中注入了 Jackson 的ObjecMapper和 Spring WebTestClient ,以根據相應/預期的 JSON 模式檢查 HTTP 響應。

問題是:如果我在應用程序運行時使用任何 HTTP 客戶端,那么沒有元素的集合(在 Java 端)將作為空數組序列化到 JSON 中——這就是我所期望的,無論理論上是對還是錯; 但是在測試用例中,相同的空集合被序列化為null值。

所以我想知道為什么會有所不同 我希望在任何時候都有相同的 JSON 字符串。

我知道我沒有使用不同的ObjectMapper設置——或者這就是我的想法。 我沒有該類型的任何自定義 Spring bean,因此我使用默認情況下 Spring Boot 注入的任何內容,因此對於正在運行的應用程序以及在運行測試時,它必須相同。 Jackson 的唯一自定義是在 application.yml 中的application.yml程序級別完成的:

spring:
  ...
  jackson:
    property-naming-strategy: LOWER_CAMEL_CASE
    serialization:
      write-date-timestamps-as-nanoseconds: false
      write-dates-as-timestamps: true
  ...

我正在使用com.networknt:json-schema-validator:1.0.43庫來實現 JSON 模式。


測試用例之一的摘錄:

@WebFluxTest(controllers = [ExamController::class])
internal class ExamControllerTest {
  @Autowired
  private lateinit var webClient: WebTestClient

  @Autowired
  private lateinit var mapper: ObjectMapper

  @Test
  @Disabled
  fun getById_ValidateResponseAgainstSchema() {
    // IMPORTANT: If you update anything here, make the corresponding changes also to getById_WhenRecordExists
    webClient.get()
        .uri("/exams/10001030")
        .accept(MediaType.APPLICATION_JSON)
        .exchange()
        .expectStatus().isOk
        .expectBody()
        .consumeWith { result ->
          val schemaFactory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V201909)
          this::class.java.getResourceAsStream("/json-schemas/exam/exam-details.json").use {
            Assertions.assertThat(schemaFactory.getSchema(it).validate(mapper.readTree(result.responseBody))).isEmpty()
          }
        }
  }

  // ...
}

測試數據是使用 Testcontainers 在 Docker 容器中創建/播種的。

禁用DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT ,以便 Jackson 不會將空數組反序列化為空值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM