gpt4 book ai didi

json - 如何测试包含 java.time.Instant 字段的 spring-cloud-contract

转载 作者:行者123 更新时间:2023-11-28 21:19:46 34 4
gpt4 key购买 nike

我想测试一个契约(Contract),其中一个字段的类型是 java.time.Instant。但并不是所有的 Instant 实例都像我期望的那样被 spring-cloud-contract 处理。给定以下简单合约:

Contract.make {
description("Get a version")
request {
method 'GET'
url '/config/version'
headers {
contentType(applicationJson())
}
}
response {
status 200
body(
nr: 42,
creationDate: producer(anyIso8601WithOffset())
)
headers {
contentType(applicationJson())
}
}
}

以及此服务实现:

@RestController
public class VersionController {
@GetMapping(path = "/version")

public ResponseEntity<Version> getCurrentVersion() {
return ResponseEntity.ok(new Version(42, Instant.ofEpochMilli(0)));
}
}

执行 gradle 测试工作正常。但是,如果我将 Instant 替换为 Instant.now(),我的提供者测试将失败并显示

java.lang.IllegalStateException: Parsed JSON [{"nr":42,"creationDate":"2018-11-11T15:28:26.958284Z"}] doesn't match the JSON path [$[?(@.['creationDate'] =~ /([0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\.\d{3})?(Z|[+-][01]\d:[0-5]\d)/)]]

这是可以理解的,因为 Instant.now() 生成一个 Instant,其字符串表示确实与 anyIso8601WithOffset() 模式不匹配。但这是为什么呢?为什么 Instants 以不同的方式表示,我如何描述一个在任何瞬间都有效的合约?

最佳答案

好的,我找到了适合我的解决方案。虽然我不知道这是不是要走的路。

为了始终获得与序列化即时完全相同的格式,我将版本 bean 的相应属性的格式定义如下:

public class Version {
private final int nr;
private final Instant creationDate;

@JsonCreator
public Version(
@JsonProperty("nr") int nr,
@JsonProperty("creationDate") Instant creationDate)
{
this.nr = nr;
this.creationDate = creationDate;
}

public int getNr() {
return nr;
}

@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX", timezone = "UTC")
public Instant getCreationDate() {
return creationDate;
}
}

关于json - 如何测试包含 java.time.Instant 字段的 spring-cloud-contract,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53250263/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com