SpringBoot提供一系列测试工具集及注解方便我们进行测试
spring-boot-test-autoconfigure提供测试的一些自动配置,spring-boot-test提供核心测试能力,只需要导入spring-boot-starter-test即可整合测试
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
spring-boot-starter-test默认提供了以下库供我们测试使用
直接@Autowired容器中的组件进行测试
JUnit5的注解与JUnit4的注解有所变化。常用的测试注解如下:
常用断言如下:
Assertions.assertAll("valueTest",
() -> Assertions.assertTrue(true),
() -> Assertions.assertFalse(false)
);
Assertions.assertTimeout(Duration.ofMillis(2L), () -> {
Thread.sleep(1L);
});
使用示例:
package com.hh.springboot3test;
import org.junit.jupiter.api.*;
import org.springframework.boot.test.context.SpringBootTest;
// 具备测试SpringBoot容器中所有组件的功能
@SpringBootTest
// 测试类必须在主程序所在的包及其子包
class SpringBoot3TestApplicationTests {
@BeforeAll
static void initOne() {
System.out.println("init one");
}
@BeforeEach
void initEach() {
System.out.println("init each");
}
@DisplayName("😱")
@Test
void contextLoads() {
Integer calValue = 3;
Assertions.assertEquals(3, calValue);
Assertions.assertThrows(Exception.class, () -> {
Integer.parseInt("One");
});
}
}
JUnit 5可以通过Java中的内部类和@Nested注解实现嵌套测试,从而可以更好的把相关的测试方法组织在一起。在内部类中可以使用@BeforeEach和@AfterEach注解,而且嵌套的层数没有限制
使用示例:
package com.hh.springboot3test;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class NestTest {
@Nested
@DisplayName("nest test 1")
class NestTest1 {
@BeforeAll
static void nestTest1InitOne() {
System.out.println("nest test 1 init one");
}
@Nested
class NestTest2 {
}
}
}
参数化测试是JUnit5很重要的一个新特性,它使得用不同的参数多次运行测试成为了可能,也为我们的单元测试带来许多便利
利用@ValueSource等注解,指定入参,我们将可以使用不同的参数进行多次单元测试,而不需要每新增一个参数就新增一个单元测试,省去了很多冗余代码。常用参数注解如下:
@ParameterizedTest
@ValueSource(strings = {"one", "two", "three"}) // initEach也会执行3次
public void parameterizedValueSourceTest(String str) {
System.out.println(str);
Assertions.assertTrue(StringUtils.isNotBlank(str));
}
@ParameterizedTest
@MethodSource("fruitMethod") //指定方法名, 方法返回值就是测试用的参数
public void parameterizedMethodSourceTest(String str) {
System.out.println(str);
Assertions.assertNotNull(str);
}
static Stream<String> fruitMethod() {
return Stream.of("apple", "banana");
}