我想拥有一个自定义的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;
}
}
答案 0 :(得分:1)
以下是如何解决此问题的示意图:
创建注释CompanyAnnotation
,使其具有@ExtendWith(CompanyAnnotationProcessor)
作为元注释。这将指示Jupiter使用CompanyAnnotationProcessor
作为所有带有CompanyAnnotation
注释的测试方法的扩展。此外,CompanyAnnotation
必须是可重复的,这需要类似CompanyAnnotationList
的注释。
将CompanyAnnotationProcessor
设置为ParameterResolver
。
现在,您必须使用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