你可以在 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 {@Autowiredprivate TestRestTemplate restTemplate;@Testpublic 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 {@Autowiredprivate TestRestTemplate restTemplate;@MockBeanprivate MyService myService;@Testpublic 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 {@Autowiredprivate MyRepository myRepository;@Testpublic 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");}
}