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 值可用:
一般来说,在运行启动嵌入式 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
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
内容来源于网络,如有侵权,请联系作者删除!