Junit5
java单元测试
自定义测试运行器
测试的类很多,组合在一起成为一个测试套件
`@ExtendWith`
正常情况下仅SpringBootTest注解即可,如果对扩展性有更多需求,可以添加ExtendWith注解
@ExtendWith(DatabaseExtension.class)
@ExtendWith(WebServerExtension.class)
class MySecondTests{
//...
}
常用注解(Springboot环境)
ExtendWith
这是用来取代旧版本中的RunWith注解,
不过在SpringBoot环境如果没有特别要求无需额外配置,因为SpringBootTest中已经有了;
Test
被该注解修饰的就是测试方法;
BeforeAll
在所有测试方法执行前被执行
被该注解修饰的必须是静态方法,会在所有测试方法之前执行,会被子类继承,
取代低版本的BeforeClass;
AfterAll
在所有测试方法执行后被执行
被该注解修饰的必须是静态方法,会在所有测试方法执行之后才被执行,会被子类继承,
取代低版本的AfterClass;
BeforeEach
每个测试方法执行前都会执行一次
被该注解修饰的方法会在每个测试方法执行前被执行一次,会被子类继承,
取代低版本的Before;
AfterEach
每个测试方法执行后都会执行一次
被该注解修饰的方法会在每个测试方法执行后被执行一次,会被子类继承,取代低版本的Before;
DisplayName
测试方法的展现名称,在测试框架中展示,支持emoji;
示例:
@Test
@DisplayName("测试service层的hello方法")
void hello() {
log.info("execute hello");
assertThat(helloService.hello(NAME)).isEqualTo("Hello " + NAME);
}
Timeout
超时时长,被修饰的方法如果超时则会导致测试不通过;
代码示例:
@Test
@Timeout(unit = TimeUnit.MILLISECONDS, value = 500)//500毫秒
@Disabled
void remoteRequest() {
assertThat(helloService.remoteRequest()).isEqualTo(true);
}
Disabled
不会被执行的测试方法;
Assumptions类和Assertions类
Assertions类
是断言类,里面提供了很多静态方法,
例如assertTrue,如果assertTrue的入参为false,就会抛出AssertionFailedError异常,
Junit对抛出此异常的方法判定为失败;
简而言之,Assertions的方法抛出异常意味着测试不通过。
assertEquals()方法
测试是否和目标一致
如果不一致即失败,则抛出AssertionFailedError异常
最简单的判断(两个入参相等就不抛异常):
@Test
@DisplayName("最普通的判断")
void standardTest() {
assertEquals(2, Math.addExact(1, 1));
}
还有另一个assertEquals方法,
能接受Supplier类型的入参,
当判断不通过时才会调用Supplier.get方法获取字符串作为失败提示消息
(如果测试通过则Supplier.get方法不会被执行):
@Test
@DisplayName("带失败提示的判断(拼接消息字符串的代码只有判断失败时才执行)")
void assertWithLazilyRetrievedMessage() {
int expected = 2;
int actual = 1;
assertEquals(expected,
actual,
// 这个lambda表达式,只有在expected和actual不相等时才执行
()->String.format("期望值[%d],实际值[%d]", expected, actual));
}
assertAll()方法
可以将多个判断逻辑放在一起处理,
只要有一个报错就会导致整体测试不通过,
并且执行结果中会给出具体的失败详情:
@Test
@DisplayName("批量判断(必须全部通过,否则就算失败)")
void groupedAssertions() {
// 将多个判断放在一起执行,只有全部通过才算通过,如果有未通过的,会有对应的提示
assertAll("单个测试方法中多个判断",
() -> assertEquals(1, 1),