Пользовательские аннотации внедряются как список в JUnit - PullRequest
1 голос
/ 01 октября 2019

Я хочу иметь пользовательскую аннотацию JUnit, и если эта аннотация присутствует в тестовом методе, она должна сделать List этого объекта доступным для этого тестового метода, в основном через параметр Method.

Company - это объект внешнего класса, который содержит List<Employee>, и тест должен иметь гибкость, чтобы иметь список сотрудников по умолчанию или предоставлять собственный список.

Для моего метода теста я обрабатываю аннотацию в соответствующем тесте, однако как я могу запустить эту аннотацию для всех тестовых файлов (аналогично @BeforeMethod) и если моя методическая аннотация присутствует в методе, введите его как List<Employee>?

@Test
    @CompanyAnnotation(salary = 5)
    @CompanyAnnotation(salary = 50)
    public void testCompany(// Want to inject as method parameter of List<Employee> list) {

        for(Method method : CompanyTest.class.getDeclaredMethods()) {

                CompanyAnnotation[] annotations = method.getAnnotationsByType(
                        CompanyAnnotation.class);

                for(CompanyAnnotation d : annotations) {
                    System.out.println(b);
                }

        }

    }

===

class Company {
    // many other properties
    List<Employee> employeeList;

}

    class Employee {
       // more properties
      Integer age;
    }

    class CompanyBuilder {

    int defaultEmployeeSize = 10;

    public Company create(List<Employee> incoming) {
        List<Employee> employees = new ArrayList<>();

        employees.addAll(incoming);

        if ( employees.size() < defaultEmployeeSize )   {
            for(int i = 0; i < (defaultEmployeeSize - employees.size()); i++) {
                employee.add(new Employee());
            }
        }
        return employees;
    }
}

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Вот эскиз, как вы могли бы решить проблему:

  1. Создайте аннотацию CompanyAnnotation, чтобы она имела @ExtendWith(CompanyAnnotationProcessor) в качестве мета-аннотации. Это даст указание Юпитеру использовать CompanyAnnotationProcessor в качестве расширения для всех методов тестирования, помеченных CompanyAnnotation. Кроме того, CompanyAnnotation должно быть повторяемым, для чего требуется что-то вроде аннотации CompanyAnnotationList.

  2. Реализация CompanyAnnotationProcessor как ParameterResolver.

  3. Теперь вы должны получить исходные аннотации метода в пределах CompanyAnnotationProcessor.resolveParameter. Вы делаете это с помощью

    • , сначала получая метод: Method method = (Method) parameterContext.getDeclaringExecutable();
    • , а затем оцениваете аннотации методов: org.junit.platform.commons.support.AnnotationSupport.findRepeatableAnnotations(method, CompanyAnnotation.class); Кстати, AnnotationSupport требует добавить junit-platform-commons к вашим зависимостям.

Теперь у вас есть все ингредиенты для создания сотрудников с зарплатой, определенной в аннотации.

0 голосов
/ 01 октября 2019

У вас может быть класс BaseUnitTest, который будет иметь в качестве метода @Before разбор аннотации. Таким образом, он будет применяться ко всем существующим модульным тестам. Обратите внимание, что это немного замедлит общее время выполнения.

Как получить метод выполнения теста - Получить имя выполняемого в данный момент теста в JUnit 4

...