我对反应式编程很陌生,测试也有问题。我有一个非常简单的场景,
一个实体:
class SimpleEntity{
@Id
int id;
String name;
}
一个相关的储存库:
class SimpleEntityRepository extends JpaRepository<SimpleEntity, Integer>{
Slice<SimpleEntity> findByName(String name, Pageable pageable);
}
A相关服务:
class SimpleEntityService{
@Autowired
SimpleEntityRepository repository;
public Mono<Slice<SimpleEntity>> findByName(String name, Pageable pageable){
//All business logic excluded
return Mono.just(
repository.findByName(name, pageable);
);
}
}
相关主计长:
class SimpleEntityController{
@Autowired
SimpleEntityService service;
@RequestMapping("/some-mapping")
public Mono<Slice<SimpleEntity>> findByName(@Requestparam String name, int pageNum){
return service.findByName(name, Pageable.of(pageNum, 100));
}
}
现在,在集成测试中,我尝试使用WebTestClient访问控制器,但无法理解如何获取和反序列化响应:
@Test
public void someIntegrationTest(){
WebTestClient.ResponseSpec responseSpec = webTestClient.get()
.uri(URI)
.accept(MediaType.APPLICATION_JSON)
.exchange();
responseSpec.returnResult(SliceImpl.class).getResponseBody.blockFirst();
}
最后一行抛出以下异常:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of org.springframework.data.domain.Pageable (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: org.springframework.data.domain.SliceImpl["pageable"])
本质上,我想要的是能够获得切片并能够对其执行断言。
发布于 2022-05-11 14:55:41
在进行交换之后,您可以根据您的响应执行expectBody或expectBodyList,如果是list或object,并且比您具有的函数更多,比如包含等。
webClient
.get()
.uri("your url here")
.contentType(MediaType.APPLICATION_JSON)
.exchange()
.expectStatus()
.isOk()
.expectBodyList(YOUROBJECT.class)
.contains(object that you expect)
发布于 2022-05-11 17:13:47
这里有几个问题
为了反序列化泛型类型,使用ParameterizedTypeReference
.
value
或consumeWith
允许访问主体并断言结果.WebTestClient.get()
.uri("/some-mapping")
.exchange()
.expectStatus().isOk()
.expectBody(new ParameterizedTypeReference<Slice<SimpleEntity>>() {})
.value(slice -> {
assertEquals(...);
});
发布于 2022-11-12 14:32:58
在2022年版本的spring引导中,如果发生故障,您将看到请求和响应作为断言失败日志的一部分。如果您对在断言没有失败的情况下记录请求和响应感兴趣,您可以使用客户机调用的结果,如下所示(在Kotlin中)。
webTestClient
.get()
.uri("/something")
.exchange()
.expectStatus().isOk
.returnResult<String>() //Generic type doesn't matter in this example
.consumeWith { logger.info { it } }
这是通过returnResult
“退出”链,并使用consumeWith
访问ExchangeResult.toString()
,从而方便地打印请求和响应。
https://stackoverflow.com/questions/72200824
复制相似问题