junit 5 - Display Name 展示名称
本文地址:https://www.cnblogs.com/hchengmx/p/14883563.html
@DisplayName可以给 测试类 或者 测试方法来自定义显示的名称。可以支持 空格、特殊字符,甚至是 emoji。
1. @DisplayName
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@DisplayName("A special test case")
public class DisplayNameTest {
@Test
@DisplayName("Custom test name containing spaces")
void testWithDisplayNameContainingSpaces() {
}
@Test
@DisplayName("╯°□°)╯")
void testWithDisplayNameContainingSpecialCharacters() {
}
@Test
@DisplayName("😱")
void testWithDisplayNameContainingEmoji() {
}
}
output
2. @DisplayNameGenerator
DisplayNameGenerator 是一个接口,里面有三个方法。
String generateDisplayNameForClass(Class testClass);
String generateDisplayNameForNestedClass(Class nestedClass);
String generateDisplayNameForMethod(Class<?> testClass, Method testMethod);
DisplayNameGenerator | Behavior | Example |
---|---|---|
Standard | 默认的,没什么变化 | test_display_ok() -> test_display_ok() |
Simple | 针对没有参数的方法,去除掉尾部的括号 | test_display_ok() -> test_display_ok |
ReplaceUnderscores | 把下划线 ‘_’ 替换成空格 | test_display_ok() -> test display ok |
IndicativeSentences | class + method name | test_diaplay_ok() -> DisplayNameGeneratorTest , test_diaplay_ok() |
@DisplayNameGeneration(DisplayNameGenerator.IndicativeSentences.class)
public class DisplayNameGeneratorTest {
@Test
public void test_display_ok(){
}
}
output
3. Parameterized Tests
对于 可参数化的测试,我们可以用 ParameterizedTest
来自定义设置 DisplayName,这种时候就不需要用 DisplayName
或者 DisplayNameGenerator
package com.hchengmx.display;
import static org.junit.jupiter.params.provider.Arguments.arguments;
import java.util.stream.Stream;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
public class DisplayNameParamTest {
@ParameterizedTest(name = "#{index} - Test with {0} and {1}")
@MethodSource("argumentProvider")
void test_method_multi(String str, int length) {
}
static Stream<Arguments> argumentProvider() {
return Stream.of(
arguments("abc", 3),
arguments("lemon", 2)
);
}
}
4. Custom DisplayNameGenerator
我们也可以 继承JUnit 的 DisplayNameGenerator
来实现自定义。比如,我们不想用DisplayName注解了,觉得这个不太直观,自定义了一个 TestCaseName的注解,用来标明Test Case的名称。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestCaseName {
String value();
}
import com.hchengmx.annotation.TestCaseName;
import java.lang.reflect.Method;
import org.junit.jupiter.api.DisplayNameGenerator;
public class CustomDisplayNameGenerator extends DisplayNameGenerator.Standard {
@Override
public String generateDisplayNameForClass(Class<?> testClass) {
return "New Name for test class";
}
@Override
public String generateDisplayNameForNestedClass(Class<?> nestedClass) {
return super.generateDisplayNameForNestedClass(nestedClass);
}
@Override
public String generateDisplayNameForMethod(Class<?> testClass, Method testMethod) {
if (testMethod.isAnnotationPresent(TestCaseName.class)) {
return testMethod.getAnnotation(TestCaseName.class).value();
}
return super.generateDisplayNameForMethod(testClass, testMethod);
}
}
source code
https://gitee.com/hchengmx/junit5-samples/tree/master/src/test/java/com/hchengmx/display
參考: