Как распечатать значение CustomDisplayNameGenerator в консоли с помощью Junit 5 и java?

Я хочу напечатать значение 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 в консоли?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Код выглядит нормально, есть только одна небольшая проблема:

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

есть ли способ получить имя класса, связанное с аннотацией @DisplayNameGeneration?

SeleniumUser 18.04.2023 09:31

может что-то подобное nameGenerator.generateDisplayNameForClass(new Object() {}.getClass())) ?

Emanuel Trandafir 18.04.2023 09:36

Нет, я хочу передать CustomDisplayNameGenerator.class во время выполнения методу DisplayNameGenerator.getDisplayNameGenerator().

SeleniumUser 18.04.2023 09:46

да - я верю, что вы можете что-то сделать. Я вернусь немного позже в тот же день с другим ответом

Emanuel Trandafir 18.04.2023 10:23

Я могу решить это, спасибо

SeleniumUser 18.04.2023 11:47

я обновил ответ альтернативным решением, я считаю, что это довольно круто, взгляните :)

Emanuel Trandafir 18.04.2023 12:51

Другие вопросы по теме