Spring boot 在Spring集成测试中将分区时间转换为UTC
我正在尝试验证我的反应式rest控制器是否传输了正确的数据。此数据包含我需要保留的Spring boot 在Spring集成测试中将分区时间转换为UTC,spring-boot,spring-webflux,reactive,Spring Boot,Spring Webflux,Reactive,我正在尝试验证我的反应式rest控制器是否传输了正确的数据。此数据包含我需要保留的ZonedDateTime字段。但是,当使用WebTestClient查询rest控制器时,我的验证失败,因为收到的时间突然以UTC为单位 @Data public class SimpleData { ZonedDateTime zdt; } @RestController class SimpleDataController { @Autowired SimpleDataService ser
ZonedDateTime
字段。但是,当使用WebTestClient
查询rest控制器时,我的验证失败,因为收到的时间突然以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));
}
}
@数据
公共类SimpleData{
分区时间zdt;
}
@RestController
类SimpleDataController{
@自动连线SimpleDataService服务;
@GetMapping(“/simple”)
列表getData(){
return service.getTimes();
}
}
@服务
类SimpleDataService{
公共静态最终SimpleData数据=新SimpleData();
静止的{
DATA.setZdt(ZoneDateTime.now(ZoneId.of(“欧洲/柏林”)));
}
公共列表getTimes(){
(数据)的返回列表;
}
}
@SpringBootTest(webEnvironment=SpringBootTest.webEnvironment.DEFINED\u端口)
@ActiveProfiles(“测试”)
类应用程序测试{
@试验
void simplestatest(){
List fromRest=WebTestClient.bindToServer().baseUrl(“http://localhost:8080).build()
.get().uri(“/simple”).exchange()
.expectBodyList(SimpleData.class)
.returnResult().GetResponseBy();
assertThat(fromRest).containsAll(Collections.singletonList(SimpleDataService.DATA));
}
}
这与
应为ArrayList:
包含:
但找不到以下元素:
时间本身是正确的-时区差从小时字段中减去-但它显然不符合相等值。有趣的是,如果使用客户端查询url,JSON包含正确的数据:
[{“zdt”:“2020-08-05T11:44:10.4740259+02:00”}]
似乎是TestWebClient
在转换时间
这是有意的吗?我可以改变这种行为吗?总之,
仅将日期调整到上下文时区是不够的,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));
}
}
如果没有解决办法,我就睡不着。好了,给你!您的问题的有效解决方案。:)
@JsonComponent
类ZonedDateTimeJsonSerializer扩展JsonSerializer{
静态DateTimeFormatter formatter=DateTimeFormatter.ISO_ZONED_DATE_TIME;
@凌驾
公共无效序列化(ZonedDateTime zdt、JsonGenerator、JsonGenerator、,
SerializerProvider SerializerProvider)引发IOException,
JsonProcessingException{
writeString(zdt.format(格式化程序));
}
}
@JsonComponent
类ZonedDateTimeJsonDeserializer扩展了JsonDeserializer{
静态DateTimeFormatter formatter=DateTimeFormatter.ISO_ZONED_DATE_TIME;
@凌驾
公共分区DateTime反序列化(JSONP解析器,反序列化上下文ctxt)
抛出IOException、JsonProcessingException{
返回ZonedDateTime.parse(p.getValueAsString(),格式化程序);
}
}
@SpringBootTest(webEnvironment=SpringBootTest.webEnvironment.DEFINED\u端口)
@ActiveProfiles(“测试”)
@自动配置WebTestClient
类应用程序测试{
@自动连线
私有WebTestClient;//重要!因为必须提取@jsonComponent
@试验
void simplestatest(){
List fromRest=client。
.get().uri(“/simple”).exchange()
.expectBodyList(SimpleData.class)
.returnResult().GetResponseBy();
断言(弗罗斯特)
.containsAll(singletonList(SimpleDataService.DATA));
}
}
这有帮助吗?这是否回答了您的问题@KavithakaranKanapathippillai嗯,看起来是一样的,但是在接受的答案中设置值并不会改变我的行为,只是意识到它不会工作,因为WebTestClient
是一个手动创建的bean,所以它不知道spring属性,在我的回答中,我最初没有使用autowired客户端并对其进行了更新。它还需要spring boot starter webflux
依赖项,我假设您现在有itOMG,它包含正确的分区时间,但缺少分区id(欧洲/柏林),因此仍然失败。总之,就是这样,谢谢你。
spring.jackson.deserialization.ADJUST_DATES_TO_CONTEXT_TIME_ZONE = false
@JsonComponent
class ZonedDateTimeJsonSerializer extends JsonSerializer<ZonedDateTime> {
static DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;
@Override
public void serialize(ZonedDateTime zdt, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException,
JsonProcessingException {
jsonGenerator.writeString(zdt.format(formatter));
}
}
@JsonComponent
class ZonedDateTimeJsonDeserializer extends JsonDeserializer<ZonedDateTime> {
static DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;
@Override
public ZonedDateTime deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
return ZonedDateTime.parse(p.getValueAsString(),formatter);
}
}
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ActiveProfiles("test")
@AutoConfigureWebTestClient
class ApplicationTests {
@Autowired
private WebTestClient client; // important! as the @jsonComponent has to be picked up
@Test
void simpleDataTest() {
List<SimpleData> fromRest = client.
.get().uri("/simple").exchange()
.expectBodyList(SimpleData.class)
.returnResult().getResponseBody();
assertThat(fromRest)
.containsAll(singletonList(SimpleDataService.DATA));
}
}