首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用WebTestClient获取响应

如何使用WebTestClient获取响应
EN

Stack Overflow用户
提问于 2022-05-11 12:09:17
回答 3查看 751关注 0票数 1

我对反应式编程很陌生,测试也有问题。我有一个非常简单的场景,

一个实体:

代码语言:javascript
运行
复制
class SimpleEntity{
  @Id    
  int id;
  String name;
}

一个相关的储存库:

代码语言:javascript
运行
复制
class SimpleEntityRepository extends JpaRepository<SimpleEntity, Integer>{

  Slice<SimpleEntity> findByName(String name, Pageable pageable);

}

A相关服务:

代码语言:javascript
运行
复制
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);
    );
  }

}

相关主计长:

代码语言:javascript
运行
复制
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访问控制器,但无法理解如何获取和反序列化响应:

代码语言:javascript
运行
复制
@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"])

本质上,我想要的是能够获得切片并能够对其执行断言。

EN

回答 3

Stack Overflow用户

发布于 2022-05-11 14:55:41

在进行交换之后,您可以根据您的响应执行expectBody或expectBodyList,如果是list或object,并且比您具有的函数更多,比如包含等。

代码语言:javascript
运行
复制
webClient
    .get()
    .uri("your url here")
    .contentType(MediaType.APPLICATION_JSON)
    .exchange()
    .expectStatus()
    .isOk()
    .expectBodyList(YOUROBJECT.class)
    .contains(object that you expect)
票数 2
EN

Stack Overflow用户

发布于 2022-05-11 17:13:47

这里有几个问题

为了反序列化泛型类型,使用ParameterizedTypeReference.

  • The,您可以使用
  1. 来验证响应,并且没有必要阻塞。例如,valueconsumeWith允许访问主体并断言结果.

代码语言:javascript
运行
复制
WebTestClient.get()
        .uri("/some-mapping")
        .exchange()
        .expectStatus().isOk()
        .expectBody(new ParameterizedTypeReference<Slice<SimpleEntity>>() {})
        .value(slice -> {
            assertEquals(...);
        });
票数 0
EN

Stack Overflow用户

发布于 2022-11-12 14:32:58

在2022年版本的spring引导中,如果发生故障,您将看到请求和响应作为断言失败日志的一部分。如果您对在断言没有失败的情况下记录请求和响应感兴趣,您可以使用客户机调用的结果,如下所示(在Kotlin中)。

代码语言:javascript
运行
复制
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(),从而方便地打印请求和响应。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72200824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档