自定义注释注入为JUnit中的列表

时间:2019-10-01 06:25:18

标签: java junit annotations junit5

我想拥有一个自定义的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 个答案:

答案 0 :(得分:1)

以下是如何解决此问题的示意图:

  1. 创建注释CompanyAnnotation,使其具有@ExtendWith(CompanyAnnotationProcessor)作为元注释。这将指示Jupiter使用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

现在,您已具备使用注释中定义的薪水创建员工的所有要素。

答案 1 :(得分:0)

您可以拥有一个BaseUnitTest类,该类将具有@Before方法作为注释解析。这样,它将适用于所有现有的单元测试。 请注意,这会降低总执行时间。

如何获取执行中的测试方法-Get name of currently executing test in JUnit 4