记@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引发的一个坑-创新互联
文章URL:http://hbruida.cn/article/cecpee.html