我是一个React式编程新手,在测试时遇到了麻烦。我有一个非常简单的场景,
实体:
class SimpleEntity{
@Id
int id;
String name;
}
相关存储库:
class SimpleEntityRepository extends JpaRepository<SimpleEntity, Integer>{
Slice<SimpleEntity> findByName(String name, Pageable pageable);
}
相关服务:
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"])
我本质上想要的是能够获得Slice并能够在其上执行Assert。
3条答案
按热度按时间mwngjboj1#
在完成交换之后,您可以根据您的响应(如果是列表或对象)执行expectBody或expectBodyList,然后您可以使用contain等函数。
kiayqfof2#
这里有几个问题
1.若要还原序列化泛型型别,请使用
ParameterizedTypeReference
。1.您可以使用
WebTestClient
API来验证响应,并且不需要阻塞。例如,value
或consumeWith
允许访问主体并Assert结果。yyhrrdl83#
在2022版本的spring Boot 中,如果发生了失败,您会看到请求和响应作为Assert失败日志的一部分。如果您有兴趣在Assert没有失败的情况下记录请求和响应,您可以使用客户端调用的结果,如下所示(在Kotlin中)。
其工作原理是通过
returnResult
“退出”链,并使用consumeWith
访问ExchangeResult.toString()
,ExchangeResult.toString()
可以方便地打印请求和响应。