记@AutoConfigureWebTestClient引发的一个坑-创新互联
在spring boot项目调试单测时,默认webTestClient的请求超时时间为5秒,稍微在断点出停留,便会触发请求超时的异常
成都创新互联公司长期为成百上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为阜阳企业提供专业的成都网站设计、网站制作、外贸营销网站建设,阜阳网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。Timeout on blocking read for 5000000000 NANOSECONDS
java.lang.IllegalStateException: Timeout on blocking read for 5000000000 NANOSECONDS
at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:123)
at reactor.core.publisher.Mono.block(Mono.java:1731)
因此会在类上添加修改超时时间
@AutoConfigureWebTestClient(timeout = “PT10M”)
@ContextConfiguration
@ComponentScan("com.crypto.reward.ops")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ExtendWith(TestDataSetup.class)
@AutoConfigureWebTestClient(timeout = "PT10M")
public abstract class ApplicationTest {...
}
然而,项目的jackson配置的是snake格式,
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {return builder ->builder.modules(modules())
.failOnUnknownProperties(false)
.propertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)
.serializationInclusion(JsonInclude.Include.NON_ABSENT)
.featuresToEnable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE)
;
}
此时mock的数据便会无法正常解析,因为@AutoConfigureWebTestClient注解引入后,导致response.bodyToMono按照camel格式解析,造成无法正常反序列化
publicMono>getResultMono(ParameterizedTypeReference>resultType, String uri) {return webClient.get()
.uri(uri)
.exchangeToMono(response ->{if (response.statusCode().equals(HttpStatus.OK)) {return response.bodyToMono(resultType);
} else {return response.createException()
.flatMap(e ->Mono.just(Result.ofFail(e.getStatusText(), e.getMessage())));
}
});
}
测试用例如
PageRespDtorespDto = new PageRespDto<>();
Result>resp = Result.ofSuccess(respDto);
mockWebServer.enqueue(new MockResponse()
.setResponseCode(200)
.setBody(objectMapper.writeValueAsString(resp))
.addHeader("Content-Type", "Application/json"));
webTestClient.method(httpMethod).uri(uri)
.cookie(cookieName, sessionId)
.exchange()
.expectStatus()
.value(status ->{assertThat(status).isEqualTo(HttpStatus.OK.value());
})
.expectBody(type)
.value(result ->{assertThat(result.isOk()).isTrue();
});
具体原理还未知,有知道的大佬麻烦评论告知,thanks~~
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
文章题目:记@AutoConfigureWebTestClient引发的一个坑-创新互联
网站地址:http://pwwzsj.com/article/cecpee.html