如何在junit4的@SuiteClasses中指定要添加的类

如何在junit4的@SuiteClasses中指定要添加的类,junit,junit4,Junit,Junit4,在Junit 4中,我们使用注释添加测试套件,如下所述: @RunWith(Suite.class) @SuiteClasses({ A.class, B.class }) public class MyTestsuite { } public class MyTestsuite extends TestCase { public static Test suite() { TestSuite suite = new TestSuite(); if(some_con

在Junit 4中,我们使用注释添加测试套件,如下所述:

@RunWith(Suite.class)
@SuiteClasses({
A.class, B.class })
public class MyTestsuite
{
}
public class MyTestsuite extends TestCase
{
  public static Test suite()
  {
     TestSuite suite = new TestSuite();
     if(some_condition_true)
     {
       suite.addTest(A.suite);
     }
     suite.addTest(B.suite);
     return suite;
  }
}
我的问题是,我们是否有办法指定条件来决定我想在@SuiteClasses中包含哪些类。例如在上面的代码中,如果我想在某个特定条件为真的情况下使用类A,否则我不想将其添加到@SuiteClasses

在junit 3.8中,我们使用如下所述的suite()方法进行此操作:

@RunWith(Suite.class)
@SuiteClasses({
A.class, B.class })
public class MyTestsuite
{
}
public class MyTestsuite extends TestCase
{
  public static Test suite()
  {
     TestSuite suite = new TestSuite();
     if(some_condition_true)
     {
       suite.addTest(A.suite);
     }
     suite.addTest(B.suite);
     return suite;
  }
}
使用junit 4有什么方法可以实现这一点吗?

扩展套件:

@RunWith(MySuite.class)//Customized
@SuiteClasses({
A.class, B.class })
public class MyTestsuite
{}
定义MySuite:

public class MySuite extends Suite {
           public MySuite(Class<?> klass, RunnerBuilder builder)
                    throws InitializationError {
                super(klass, builder);
                try {
                    filter(new Filter() {
                        @Override public boolean shouldRun(Description description) {
                            return some_condition_true? true : false;
                        }

                        @Override
                        public String describe() {
                            return "...";
                        }
                    });
                } catch (NoTestsRemainException e) {
                    System.out.println("Hey, all test cases are not satisfied your condition.");
                }
            }
        }
公共类MySuite扩展套件{
公共MySuite(类klass、RunnerBuilder)
抛出初始化错误{
超级(克拉斯,建筑商);
试一试{
过滤器(新过滤器(){
@重写公共布尔值shouldlrun(说明){
返回某个条件为真?真:假;
}
@凌驾
公共字符串descripe(){
返回“…”;
}
});
}捕获(notestsremaine异常){
System.out.println(“嘿,所有测试用例都不满足您的条件。”);
}
}
}

另外:虽然它可以工作,但我建议保持测试用例的简单。维护复杂的东西是很困难的。

生源的答案会有用的

另一个选项是始终添加测试类,但在类中有一个assumeTrue(条件),它将决定何时应该运行以及何时没有意义


(当条件与测试先决条件相关时,我更喜欢这种方法:测试本身是知道它是否应该运行的最佳场所)。

例如,如果处理A.class和B.class,如何将值传递给MySuite以检查它?