在Spring Boot测试中
首先
我在用SpringBoot创建的Web应用中实现了测试代码。
执行环境
操作系统:Mac
JUnit:JUnit5.8.2
Java:Amazon Corretto 8
Spring Boot:2.6.1
Gradle:gradle6.8
集成开发环境:IntelliJ IDEA 社区版 2021.1
建立测试环境
使用spring-boot-starter-test库
通过使用「spring-boot-starter-test」,可以使用必要的库来测试在SpringBoot上的代码。
所包含的库如下所示
Spring Boot TestSpring Bootアプリケーションのユーティリティ。
統合テストのための機能をサポートしています。AssertJ 高機能なアサーションライブラリ。Hamcrest マッチャーオブジェクトのライブラリ。
オブジェクトの状態をテストするのに利用される。Mockito Javaモックフレームワーク。
テストするクラスが依存しているDI管理下のオブジェクトをモック化したりできる。JSONassert JSON のアサーションライブラリ。JsonPath JSONでもXPATHのように、クエリ形式で要素を検索したりするライブラリ。
在build.gradle中添加依赖关系
将「spring-boot-starter-test」添加为依赖。
dependencies {
// ・・・
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
写测试
测试的网页应用程序
测试的Web应用程序会返回”HelloWorld”。
它会从Controller接收请求,从Service获取字符串”HelloWorld”,然后返回给客户端。
@Controller
public class HelloWorldController {
private HelloWorldService helloworldService;
@Autowired
public HelloWorldController(HelloWorldService helloworldService) {
this.helloworldService = helloworldService;
}
@ResponseBody
@GetMapping
public String index() {
return helloworldService.getString();
}
}
@Service
public class HelloWorldService {
public String getString() {
return "HelloWorld";
}
}
在Spring Boot-starter-test中编写测试的方法
如果要进行基于SpringBoot的测试,可以在测试类上使用@SpringBootTest注解。
通过使用@SpringBootTest注解,可以将SpringExtension指定为JUnit的扩展功能,从而可以使用以下功能。
・Spring TestContext框架
无需受限于JUnit等测试框架,它能在测试代码中支持DI管理和事务功能。
・MockMvc(Spring MVC 测试框架)
支持Spring MVC应用程序的测试。
对Controller进行测试。
在测试类中,使用@SpringBootTest和@AutoConfigureMockMvc对Controller进行测试,以确保能够请求到“HelloWorld”。
给予 @AutoConfigureMockMvc 后,将自动配置 MockMvc。
这样,可以像通常在服务器上运行时一样处理控制器和依赖的服务。
使用MockMvc和MockMvcRequestBuilders向控制器发送请求,然后使用MockMvcResultMatchers检查结果。
我正在验证对「http://localhost/」发出请求后的结果是,返回的http状态为OK(200),且内容包含「HelloWorld」。
这次我们执行了没有参数的请求,但我们也可以使用MockMvcRequestBuilders设置URL参数。
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
@SpringBootTest
@AutoConfigureMockMvc
public class HelloWorldControllerTest {
@Test
void HelloWorldが取得されることを確認(@Autowired MockMvc mvc) throws Exception {
mvc.perform(
MockMvcRequestBuilders.get("/"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string("HelloWorld"));
}
}
进行服务测试
像 Controller 的测试类一样给予 @SpringBootTest 标签。这里使用构造函数注入的方式获取依赖注入管理下的实例。
正常情况下执行Service方法,并使用断言库验证返回值。
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
public class HelloWorldServiceTest {
private final HelloWorldService helloWorldService;
@Autowired
public HelloWorldServiceTest(HelloWorldService helloworldService) {
this.helloWorldService = helloworldService;
}
@Test
void HelloWorldが取得されることを確認() throws Exception {
String result = helloWorldService.getString();
assertThat(result).isEqualTo("HelloWorld");
}
}
文献引用