[英]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.