Я хочу напечатать значение CustomDisplayNameGenerator в консоли, используя junit 5 и java.
import org.junit.jupiter.api.DisplayNameGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Method;
public class CustomDisplayNameGenerator extends DisplayNameGenerator.Standard {
private static final Logger logger = LoggerFactory.getLogger(CustomDisplayNameGenerator.class);
@Override
public String generateDisplayNameForClass(Class<?> testClass) {
return replaceCamelCase(super.generateDisplayNameForClass(testClass));
}
@Override
public String generateDisplayNameForNestedClass(Class<?> nestedClass) {
return replaceCamelCase(super.generateDisplayNameForNestedClass(nestedClass));
}
@Override
public String generateDisplayNameForMethod(Class<?> testClass, Method testMethod) {
StringBuilder result = new StringBuilder();
result.append( "Test" + ";");
result.append( "Project" + "Test;");
result.append( "JIRA id" + "435345;");
return result.toString();
}
String replaceCamelCase(String camelCase) {
StringBuilder result = new StringBuilder();
result.append(camelCase.charAt(0));
for (int i = 1; i < camelCase.length(); i++) {
if (Character.isUpperCase(camelCase.charAt(i))) {
result.append(' ');
result.append(Character.toLowerCase(camelCase.charAt(i)));
} else {
result.append(camelCase.charAt(i));
}
}
return result.toString();
}
}
Я не уверен, что мне нужно делать дальше. Может кто-то мне помочь, пожалуйста? Вот код, который у меня есть:
import Framework.Annotations.Common.*;
import org.junit.jupiter.api.*;
import java.lang.annotation.Annotation;
import static org.junit.jupiter.api.DisplayNameGenerator.getDisplayNameGenerator;
@DisplayNameGeneration(CustomDisplayNameGenerator.class)
public class JUnit5GeneratedExample {
@Test
void simpleTestExecution() {
Annotation displayNameGeneration = getClass().getAnnotation(DisplayNameGeneration.class);
if (displayNameGeneration != null) {
System.out.println(displayNameGeneration.toString());
DisplayNameGenerator name = getDisplayNameGenerator(DisplayNameGenerator.Standard.class);
System.out.println(name.generateDisplayNameForMethod(CustomDisplayNameGenerator.class, new Object(){}.getClass().getEnclosingMethod()));
}
System.out.printf("This is printed");
}
}
Я пытаюсь напечатать ниже выделенный текст в своей консоли. Есть ли способ распечатать CustomDisplayNameGenerator в консоли?




Код выглядит нормально, есть только одна небольшая проблема:
DisplayNameGenerator name = getDisplayNameGenerator(DisplayNameGenerator.Standard.class);
Эта строка вернет экземпляр DisplayNameGenerator.Standard, поэтому в вашем случае вы захотите использовать там свой собственный класс:
DisplayNameGenerator nameGenerator = DisplayNameGenerator.getDisplayNameGenerator(CustomDisplayNameGenerator.class);
System.out.println(nameGenerator.generateDisplayNameForMethod(CustomDisplayNameGenerator.class, new Object(){}.getClass().getEnclosingMethod()));
С другой стороны, это не будет сильно отличаться от прямого вызова конструктора:
DisplayNameGenerator nameGenerator = new CustomDisplayNameGenerator();
System.out.println(nameGenerator.generateDisplayNameForMethod(CustomDisplayNameGenerator.class, new Object(){}.getClass().getEnclosingMethod()));
Как обсуждалось в комментариях, я нашел лучшее решение для этого: вы можете определить собственное тестовое расширение, которое реализует BeforeTestExecutionCallback:
public class PrintTestNameBeforeEach implements BeforeTestExecutionCallback {
@Override
public void beforeTestExecution(ExtensionContext context) {
System.out.println(context.getDisplayName());
}
}
Теперь вы можете просто аннотировать любой тестовый класс с помощью @ExtendWith(PrintTestNameBeforeEach.class), и все методы будут напечатаны с использованием пользовательского генератора отображаемых имен, если он у вас есть.
@ExtendWith(PrintTestNameBeforeEach.class)
@DisplayNameGeneration(CustomDisplayNameGenerator.class)
class JUnit5Callbacks {
@Test
void myFirstTest() {
System.out.println("running the first test...");
}
@Test
void mySecondTest() {
System.out.println("running the second test...");
}
}
Ps: Я написал об этом небольшую статью для среднего звена, вы можете увидеть все шаги здесь: https://medium.com/javarevisited/junit5-callbacks-in-less-than-3-minutes-55a87e000fcc
может что-то подобное nameGenerator.generateDisplayNameForClass(new Object() {}.getClass())) ?
Нет, я хочу передать CustomDisplayNameGenerator.class во время выполнения методу DisplayNameGenerator.getDisplayNameGenerator().
да - я верю, что вы можете что-то сделать. Я вернусь немного позже в тот же день с другим ответом
Я могу решить это, спасибо
я обновил ответ альтернативным решением, я считаю, что это довольно круто, взгляните :)
есть ли способ получить имя класса, связанное с аннотацией @DisplayNameGeneration?