gpt4 book ai didi

spring-boot - 分区时间在 Spring 集成测试中转换为 UTC

转载 作者:行者123 更新时间:2023-12-04 09:15:04 24 4
gpt4 key购买 nike

我正在尝试验证我的响应式(Reactive)休息 Controller 是否传输了正确的数据。此数据包含 ZonedDateTime我需要保留的字段。但是,当使用 WebTestClient 查询其余 Controller 时,我的验证失败,因为收到的时间突然在 UTC 中。

@Data
public class SimpleData {
ZonedDateTime zdt;
}

@RestController
class SimpleDataController {
@Autowired SimpleDataService service;
@GetMapping("/simple")
List<SimpleData> getData() {
return service.getTimes();
}
}

@Service
class SimpleDataService {
public static final SimpleData DATA = new SimpleData();
static {
DATA.setZdt(ZonedDateTime.now(ZoneId.of("Europe/Berlin")));
}

public List<SimpleData> getTimes() {
return List.of(DATA);
}
}
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ActiveProfiles("test")
class ApplicationTests {
@Test
void simpleDataTest() {
List<SimpleData> fromRest = WebTestClient.bindToServer().baseUrl("http://localhost:8080").build()
.get().uri("/simple").exchange()
.expectBodyList(SimpleData.class)
.returnResult().getResponseBody();
assertThat(fromRest).containsAll(Collections.singletonList(SimpleDataService.DATA));
}
}
这失败了

Expecting ArrayList:<[SimpleData(zdt=2020-08-05T09:30:40.291415300Z[UTC])]> to contain:<[SimpleData(zdt=2020-08-05T11:30:40.291415300+02:00[Europe/Berlin])]>but could not find the following element(s):<[SimpleData(zdt=2020-08-05T11:30:40.291415300+02:00[Europe/Berlin])]>


时间本身是正确的 - 时区差异是从小时字段中减去的 - 但它显然失败了。有趣的是,如果您使用客户端查询 url,JSON 包含正确的数据:

[{"zdt":"2020-08-05T11:44:10.4740259+02:00"}]


好像是 TestWebClient转换时间。
这是故意的吗?我可以以某种方式改变这种行为吗?

最佳答案

总之,ADJUST_DATES_TO_CONTEXT_TIME_ZONE仅靠是不够的,WebTestClient不应手动创建,而应使用 @AutoConfigureWebTestClient并自动连接客户端。

    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ActiveProfiles("test")
@AutoConfigureWebTestClient
class ApplicationTests {

@Autowired
private WebTestClient client;

@Test
void simpleDataTest() {
List<SimpleData> fromRest = client.
.get().uri("/simple").exchange()
.expectBodyList(SimpleData.class)
.returnResult().getResponseBody();
assertThat(fromRest)
.containsAll(singletonList(SimpleDataService.DATA));
}
}
application.properties
    spring.jackson.deserialization.ADJUST_DATES_TO_CONTEXT_TIME_ZONE = false

关于spring-boot - 分区时间在 Spring 集成测试中转换为 UTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63262546/

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