SpringBoot3与JUnit5集成测试
你可以在 Spring Boot 3 中轻松设置和运行 JUnit 集成测试。合理使用 Spring 提供的注解和工具,可以确保测试的高效性和可靠性。以下是集成测试的步骤和示例:
1. 添加依赖
在 pom.xml
中添加 Spring Boot Starter Test 依赖,它包含 JUnit 5 和其他测试工具。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2. 创建测试类
在 src/test/java
目录下创建测试类,使用 @SpringBootTest
注解来加载应用上下文。
示例
假设有一个简单的控制器:
@RestController
@RequestMapping("/api")
public class MyController {
@GetMapping("/greet")
public String greet() {
return "Hello, https://zhengkai.blog.csdn.net/";
}
}
创建一个集成测试类:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MyControllerIntegrationTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void testGreet() {
ResponseEntity<String> response = restTemplate.getForEntity("/api/greet", String.class);
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(response.getBody()).isEqualTo("Hello, https://zhengkai.blog.csdn.net/");
}
}
3. 测试配置
@SpringBootTest
:加载整个应用程序上下文。webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
用于启动嵌入式服务器以进行 HTTP 测试。TestRestTemplate
:用于发送 HTTP 请求,测试 RESTful API。
4. 运行测试
使用 IDE(如 IntelliJ IDEA 或 Eclipse)中的测试功能,或使用 Maven 命令行运行测试:
mvn test
5. 使用 MockBean
可以使用 @MockBean
模拟 Spring Bean,以便在测试中控制依赖的行为。
示例
假设有一个服务类:
@Service
public class MyService {
public String getMessage() {
return "Service message";
}
}
在测试中模拟这个服务:
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MyControllerIntegrationTest {
@Autowired
private TestRestTemplate restTemplate;
@MockBean
private MyService myService;
@Test
public void testGreet() {
Mockito.when(myService.getMessage()).thenReturn("Mocked message");
ResponseEntity<String> response = restTemplate.getForEntity("/api/greet", String.class);
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(response.getBody()).isEqualTo("Mocked message");
}
}
6. 使用 @DataJpaTest 进行 JPA 测试
如果需要测试 JPA 实体和 Repository,可以使用 @DataJpaTest
。
示例
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import static org.assertj.core.api.Assertions.assertThat;
@DataJpaTest
public class MyRepositoryTest {
@Autowired
private MyRepository myRepository;
@Test
public void testSaveAndFind() {
MyEntity entity = new MyEntity();
entity.setName("Test");
myRepository.save(entity);
MyEntity found = myRepository.findById(entity.getId()).orElse(null);
assertThat(found).isNotNull();
assertThat(found.getName()).isEqualTo("Test");
}
}