Java JUnit测试套件是否支持自定义注释?

Java JUnit测试套件是否支持自定义注释?,java,reflection,junit,annotations,test-suite,Java,Reflection,Junit,Annotations,Test Suite,在JUnit中,您可以创建如下测试套件: public class SecurityTest1 { @Test public void testSecurity1() { // ... } } public class LoadTest1 { @Test public void testLoad1() { // ... } } public class SecurityTest2 { @Test

在JUnit中,您可以创建如下测试套件:

public class SecurityTest1 {
    @Test
    public void testSecurity1() {
        // ...
    }
}

public class LoadTest1 {
    @Test
    public void testLoad1() {
        // ...
    }
}

public class SecurityTest2 {
    @Test
    public void testSecurity2() {
        // ...
    }
}

@RunWith(Suite.class)
@SuiteClasses({SecurityTest1.class, SecurityTest2.class})
public class SecurityTestSuite {}
但这似乎相当麻烦。最好定义一个简单的类级注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface SecurityTest {} 
然后像这样定义您的套件:

@SecurityTest
public class SecurityTest1 {
    @Test
    public void testSecurity1() {
        // ...
    }
}

public class LoadTest1 {
    @Test
    public void testLoad1() {
        // ...
    }
}

@SecurityTest
public class SecurityTest2 {
    @Test
    public void testSecurity2() {
        // ...
    }
}

@RunWith(Suite.class)
@SuiteClasses({SecurityTest.class})
public class SecurityTestSuite {}

这可能吗?如果是,怎么做注意:如果JUnit不支持此功能,则对切换到TestNG或任何其他测试框架不感兴趣…提前感谢

您可以通过实现自己的类似于runner的功能来实现

此运行程序应该从
@SuiteClasses
注释的值中提取标记注释类(您可能应该用自己的注释替换
@SuiteClasses
)。查看
org.junit.runners.Suite
类的
getAnnotatedClass
方法。
拥有marker annotation类后,您应该扫描类路径以查找标记有此注释的测试类(使用库,例如),并将它们的数组传递给相应的运行器构造函数。
您可以在
套件
构造函数中找到类似的行为:

public Suite(Class<?> klass, RunnerBuilder builder) throws InitializationError {
   this(builder, klass, getAnnotatedClasses(klass));
} 
public套件(类klass,RunnerBuilder)引发初始化错误{
这(建筑商、klass、GetAnnotatedClass(klass));
} 

您可以通过实现自己的类似于runner的功能来实现

此运行程序应该从
@SuiteClasses
注释的值中提取标记注释类(您可能应该用自己的注释替换
@SuiteClasses
)。查看
org.junit.runners.Suite
类的
getAnnotatedClass
方法。
拥有marker annotation类后,您应该扫描类路径以查找标记有此注释的测试类(使用库,例如),并将它们的数组传递给相应的运行器构造函数。
您可以在
套件
构造函数中找到类似的行为:

public Suite(Class<?> klass, RunnerBuilder builder) throws InitializationError {
   this(builder, klass, getAnnotatedClasses(klass));
} 
public套件(类klass,RunnerBuilder)引发初始化错误{
这(建筑商、klass、GetAnnotatedClass(klass));
} 

研究实现您自己的
BlockJUnit4ClassRunner
。研究实现您自己的
BlockJUnit4ClassRunner