写好单元测试是一门技术活,本文就介绍这些优秀的框架,同时介绍编写优秀的 Sping Boot 单元测试所必需的技术细节,
添加依赖
org.springframework.boot
spring-boot-starter-test
test
org.junit.jupiter
junit-jupiter
5.5.2
test
org.projectlombok
lombok
spring-boot-starter-test 默认引入了 Mockito 和AssertJ,对于 Lombok、JUnit5 则需要我们自己手工引入。
不要使用 Spring 进行单元测试
看一下下面的「单元」测试,是用来测试 RegisterUseCase 类的一个方法:
@ExtendWith(SpringExtension.class)
@SpringBootTest
class RegisterUseCaseTest {
@Autowired
private RegisterUseCase registerUseCase;
@Test
void savedUserHasRegistrationDate() {
User user = new User("zaphod", "zaphod@mail.com");
User savedUser = registerUseCase.registerUser(user);
assertThat(savedUser.getRegistrationDate()).isNotNull();
}
}
执行这个测试类,花了大概 4.5 秒的时间,原因仅仅是因为计算机要为它去运行一个空的 Spring 项目。
但是,一个好的单元测试应该是毫秒级的,否则这会影响「test / code / test」的工作方式,这也就是测试驱动开发的思想 (TDD)。即使我们不做 TDD,在编写测试上花了太多时间也会影响我们的开发思路。
其实,上面的测试方法实际执行只花费了几毫秒,剩下的 4.5 秒全部花费在了 @SpringBootRun 上,因为 Spring Boot 需要启动整个 Spring Boot 应用。
也就是说,我们启动整个应用,耗费了大量资源,仅仅是去为了测试一个方法,当我们的应用未来越来越大的时候,那将耗费更久的时间去启动。
所以,为什么不要用 Spring Boot 来做单元测试呢?接下来,本文会讨论如何不用 Spring Boot 来进行单元测试。
创建测试类
通