当前位置: 首页 > 知识库问答 >
问题:

Spring webflux,测试服务器响应`

席波娃
2023-03-14

如何测试接收ServerRequest并返回Mono的处理程序方法

我可以通过org创建ServerRequest。springframework。嘲弄网状物反应性。作用服务器模拟服务器请求。builder()。并在服务器响应上断言。statusCode()。然而,我想测试这个ServerResponse的主体,但是没有办法提取它。

ServerResponse response = target.search(MockServerRequest.builder()
    .method(HttpMethod.GET)
    .build()
  ).block();

assertThat(response.statusCode()).isEqualTo(HttpStatus.OK);
//assertThat(response.body()).isNotNull();

我不想用WebTestClient进行更广泛的测试,我想用单元测试测试所有可能的响应情况。

谢谢


共有3个答案

公西光华
2023-03-14

我问了一个类似的问题,坚持不使用WebTestClient。在发现可以将响应转换为允许检查实体的类型后,我最终回答了自己的问题。

魔线(静态编程语言)是:

(serverResponse as EntityResponse<Fleet>).entity()

编辑:因此,对于预期的空体,您可以执行以下操作:

assert(serverResponse !is EntityResponse<*>)

感谢@andred指出这一点

孙文康
2023-03-14

我有完全相同的问题,因为我不想为每个测试启动整个Spring上下文。感谢自己回答中的信息,这对我有所帮助。这是一个完整的示例,包括Mockito和JUnit5:

import java.util.Arrays;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.http.MediaType;
import org.springframework.test.web.reactive.server.WebTestClient;

@ExtendWith(MockitoExtension.class)
class UsersHandlerTest {
  @Mock
  UserRepository userRepository;

  WebTestClient client;

  @BeforeEach
  public void setUp() {
    UsersHandler usersHandler = new UsersHandler(userRepository);
    Router router = new Router(usersHandler);

    Mockito.when(userRepository.findAll()).thenReturn(
      Arrays.asList("", ""));

    client = WebTestClient.bindToRouterFunction(router.getUsers()).build();
  }

  @Test
  public void getCommands() {
    client.get().uri("/users")
      .accept(MediaType.APPLICATION_JSON_UTF8)
      .exchange()
      .expectStatus().isOk()
      .expectBody().json("{}");
  }
}
幸经艺
2023-03-14

因此,最好的解决方案似乎是使用WebTestClient。然而,这一个可以在没有运行服务器的情况下使用;

sping-test模块包括一个WebTestClient,可用于测试有或没有正在运行的服务器的WebFlux服务器endpoint。

-- https://docs.spring.io/spring/docs/5.0.0.BUILD-SNAPSHOT/spring-framework-reference/html/web-reactive.html#web-反应性试验

诀窍是使用bindTo。。()builder方法。在我的例子中,bindToRouterFunction(新的MyRouter(新的MyHandler())工作得很好

 类似资料:
  • 我试图让服务器发送的事件与Mozilla Firefox一起工作。给定一个Spring Boot的网络服务 使用Chrome浏览器或Edge(始终是最新版本)可以正常工作。我可以在网络分析器选项卡中看到未完成的请求,并且每秒都会显示一个新的时间戳。 然而,当我使用Firefox(84.0.2或更早版本)时,请求也会显示在网络选项卡中,但不会显示响应头或流数据。当我终止Spring后端时,Firef

  • 像组件一样,服务通常需要依赖,Angular通过服务类的构造函数注入。由于我们在Angular的引导过程之外初始化这些类,我们必须自己显式注入这些依赖。这是通过使用TestBed配置测试模块传回所需的依赖项(如HTTP模块)来实现的。

  • Response响应对象主要将JSP容器处理后的结果传回到客户端。可以通过response变量设置HTTP的状态和向客户端发送数据,如Cookie、HTTP文件头信息等。 一个典型的响应看起来就像下面这样: HTTP/1.1 200 OK Content-Type: text/html Header2: ... ... HeaderN: ... (空行) <!doctype ...> <ht

  • 正如前面的章节中讨论的那样,当一个 Web 服务器响应一个 HTTP 请求时,响应通常包括一个状态行、一些响应报头、一个空行和文档。一个典型的响应如下所示: HTTP/1.1 200 OK Content-Type: text/html Header2: ... ... HeaderN: ... (Blank Line) <!doctype ...> <html> <head>...</he

  • 服务器响应 如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。 属性 描述 responseText 获得字符串形式的响应数据。 responseXML 获得 XML 形式的响应数据。 responseText 属性 如果来自服务器的响应并非 XML,请使用 responseText 属性。 responseText