使用 TestRestTemplate 测试 Spring Boot程序

x33g5p2x  于2022-09-28 转载在 Spring  
字(2.7k)|赞(0)|评价(0)|浏览(704)

TestRestTemplate 可用于在我们的 Spring Boot 集成测试中发送 http 请求。此类测试通常在 Spring boot 作为随机端口 @LocalServerPort 中的本地服务器运行时执行。所以只需要在集成测试中创建请求并像服务器的客户端一样发送它。 TestRestTemplate 拥有所有必要的方法以类似于 RestTemplate 的便捷方式将请求发送到服务器。

让我们看一个基本的例子。这是一个最小的控制器:

@RestController
public class PingController {
  @GetMapping("/hello")
  public String echo() {
    return "Hello";
  }
}

让我们使用 org.springframework.boot.test.web.client.TestRestTemplate 为上述端点编写一个测试:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class DemoTest {
  @Autowired TestRestTemplate restTemplate;

  @Test
  public void testHello() {
    ResponseEntity<String> respEntity = restTemplate.getForEntity("/hello", String.class);
    assertThat(respEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
    assertThat(respEntity.getBody()).isEqualTo("Hello");
  }
}

由于您需要测试 REST 端点,我们通过指定 @SpringBootTest 的 webEnvironment 属性来启动嵌入式 servlet 容器。

默认的 webEnvironment 值为 WebEnvironment.MOCK,它不会启动嵌入式 servlet 容器。

以下 webEnvironment 值可用:

  • MOCK(默认)加载 WebApplicationContext 并提供模拟 servlet 环境。它不会启动嵌入式 servlet 容器。
  • RANDOM_PORT 加载一个 ServletWebServerApplicationContext 并启动一个嵌入式 servlet 容器,监听一个随机可用端口。
  • DEFINED_PORT 加载一个 ServletWebServerApplicationContext 并启动一个嵌入式 servlet 容器,该容器在定义的端口 (server.port) 上进行侦听。
  • NONE 使用 SpringApplication 加载 ApplicationContext 但不提供 servlet 环境。

一般来说,在运行启动嵌入式 servlet 容器的集成测试时,最好使用 WebEnvironment.RANDOM_PORT,这样它就不会与其他正在运行的应用程序冲突,尤其是在多次构建的持续集成 (CI) 环境中并行运行。

测试安全控制器/服务方法

Spring Boot 提供了几种测试这些安全端点的方法。在此之前,添加以下依赖项以启用 Spring Security 和安全测试功能:

<?xml version="1.0" encoding="UTF-8"?><project>
   <dependency>
           
      <groupId>org.springframework.boot</groupId>
           
      <artifactId>spring-boot-starter-security</artifactId>
       
   </dependency>
    
   <dependency>
           
      <groupId>org.springframework.security</groupId>
           
      <artifactId>spring-security-test</artifactId>
           
      <scope>test</scope>
       
   </dependency>
    
</project>

当您在没有自定义安全配置的情况下添加安全启动器时,Spring Boot 端点将使用 HTTP 基本身份验证以及默认用户和生成的密码来保护。要覆盖它,您可以在 application.properties 中配置凭据,如下所示:

security.user.name=admin 
security.user.password=password 
security.user.role=USER,ADMIN

让我们修改上面的 TestRestTemplate 来测试 REST 端点,传递 HTTP 基本身份验证参数,如下所示:

@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class DemoTest {
  @Autowired TestRestTemplate restTemplate;
  @Test public void testHello() throws Exception {
    ResponseEntity < String > respEntity = restTemplate.withBasicAuth("admin", "password").getForEntity("/hello", String.class);
    assertThat(respEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
    assertThat(respEntity.getBody()).isEqualTo("Hello");
  }
}

请注意,您已使用 restTemplate.withBasicAuth(“admin”, “password”) 传递了凭据。

另请注意,通过使用 TestRestTemplate,您可以使用“/hello”等相对路径调用 REST 端点,而不是指定完整的 URL http://localhost:/ping

相关文章