译:基于注解的控制器:Spring Web/WebFlux 和 测试

Posted SpringForAll社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了译:基于注解的控制器:Spring Web/WebFlux 和 测试相关的知识,希望对你有一定的参考价值。

Spring Web和Spring WebFlux两个名字看上去很相似,那么进行测试时是否也类似呢?下面就让我们了解一下它们在进行测试时的不同。

原文链接:https://dzone.com/articles/annotated-controllers-spring-webwebflux-and-testin

译者:PKAQ , 2018-05-20 发布于 Spring4All

Spring WebFlux 和 Spring Web 采用的是两个完全不同的技术栈。不过, Spring Webflux 依旧支持基于注解的编程模型。

二者定义 endpoint(功能性端点)的方式是类似的,但是对 endpoint(功能性端点)进行单元测试时有着明显的不同。你必须明确所选用的技术栈来编写不同的单元测试方法。

Endpoint示例

一个基于注解的 endpoint示例:

 
   
   
 
  1. import org.springframework.web.bind.annotation.PostMapping

  2. import org.springframework.web.bind.annotation.RequestBody

  3. import org.springframework.web.bind.annotation.RequestMapping

  4. import org.springframework.web.bind.annotation.RestController

  5. data class Greeting(val message: String)

  6. @RestController

  7. @RequestMapping("/web")

  8. class GreetingController {

  9.    @PostMapping("/greet")

  10.    fun handleGreeting(@RequestBody greeting: Greeting): Greeting {

  11.        return Greeting("Thanks: ${greeting.message}")

  12.    }

  13. }

Spring Web的单元测试

如果采用基于 SpringWeb的starter创建应用,那么可以按如下方式在 Gradle配置文件中引入依赖。

 
   
   
 
  1. compile('org.springframework.boot:spring-boot-starter-web')

接下来采用 Mock MVC 来对上面的 endpoint(功能性端点)执行一个模拟的web测试。

 
   
   
 
  1. import org.junit.Test

  2. import org.junit.runner.RunWith

  3. import org.springframework.beans.factory.annotation.Autowired

  4. import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest

  5. import org.springframework.test.context.junit4.SpringRunner

  6. import org.springframework.test.web.servlet.MockMvc

  7. import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post

  8. import org.springframework.test.web.servlet.result.MockMvcResultMatchers.content

  9. @RunWith(SpringRunner::class)

  10. @WebMvcTest(GreetingController::class)

  11. class GreetingControllerMockMvcTest {

  12.    @Autowired

  13.    lateinit var mockMvc: MockMvc

  14.    @Test

  15.    fun testHandleGreetings() {

  16.        mockMvc

  17.                .perform(

  18.                        post("/web/greet")

  19.                                .content("""

  20.                                |{

  21.                                |"message": "Hello Web"

  22.                                |}

  23.                            """.trimMargin())

  24.                ).andExpect(content().json("""

  25.                    |{

  26.                    |"message": "Thanks: Hello Web"

  27.                    |}

  28.                """.trimMargin()))

  29.    }

  30. }

Spring WebFlux的单元测试

首先,像上面一样,采用如下方式引入 Spring-WebFlux相关依赖

 
   
   
 
  1. compile('org.springframework.boot:spring-boot-starter-webflux')

然后,可以使用 WebTestClient 类对上面的 endpoint编写单元测试。

 
   
   
 
  1. import org.junit.Test

  2. import org.junit.runner.RunWith

  3. import org.springframework.beans.factory.annotation.Autowired

  4. import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest

  5. import org.springframework.http.HttpHeaders

  6. import org.springframework.test.context.junit4.SpringRunner

  7. import org.springframework.test.web.reactive.server.WebTestClient

  8. import org.springframework.web.reactive.function.BodyInserters

  9. @RunWith(SpringRunner::class)

  10. @WebFluxTest(GreetingController::class)

  11. class GreetingControllerTest {

  12.    @Autowired

  13.    lateinit var webTestClient: WebTestClient

  14.    @Test

  15.    fun testHandleGreetings() {

  16.        webTestClient.post()

  17.                .uri("/web/greet")

  18.                .header(HttpHeaders.CONTENT_TYPE, "application/json")

  19.                .body(BodyInserters

  20.                        .fromObject("""

  21.                                |{

  22.                                |   "message": "Hello Web"

  23.                                |}

  24.                            """.trimMargin()))

  25.                 //使用exchange()方法来检索响应          

  26.                .exchange()

  27.                .expectStatus().isOk

  28.                .expectBody()

  29.                .json("""

  30.                    |{

  31.                    |   "message": "Thanks: Hello Web"

  32.                    |}

  33.                """.trimMargin())

  34.    }

  35. }

结论

显而易见, SpringWeb和 SpringWebFlux两者的编码方式十分相似,并且 SpirngWebFlux也延续了 SpringWeb的测试方式。但是,作为一名开发者,应该注意到它们之间潜在的不同并根据实际情况编写测试代码。希望你通过这篇文章能了解到来如何编写不同的用例代码。

最后

关注社区公号,加入社区纯技术微信群


以上是关于译:基于注解的控制器:Spring Web/WebFlux 和 测试的主要内容,如果未能解决你的问题,请参考以下文章

译spring注解编程模型

Spring 事务控制 -- 基于注解的声明式事务控制

Java--Spring之IoC控制反转;基于注解的DI

基于 Spring MVC 的站点(注解控制器)上的状态消息

Spring MVC学习—基于注解的Controller控制器的配置全解一万字

阶段3 2.Spring_10.Spring中事务控制_7 spring基于注解的声明式事务控制