java - 如何在 JUnit 4 中动态创建测试套件?

标签 java junit junit4

我想使用 JUnit 4 创建一个 junit 测试套件,其中要包含的测试类的名称在测试套件运行之前是未知的。

在 JUnit 3 中我可以这样做:

public final class MasterTester extends TestCase
{
  /**
   * Used by junit to specify what TestCases to run.
   * 
   * @return a suite containing what TestCases to run
   */
  public static TestSuite suite() {
    TestSuite suite = new TestSuite();

    for(Class<?> klass : gatherTestClasses()) {
      suite.addTestSuite(klass);
    }

    return suite;
  }
}

并让 gatherTestClasses() 方法处理确定要运行的测试类。

在 JUnit 4 中,documentation说要使用注释: @SuiteClasses({TestClass1.class, TestClass2.class...}) 来构建我的测试套件。有numerous SO answers展示如何做到这一点。不幸的是,我看到的示例似乎不允许传递动态生成的 TestClasses 列表。

这个 SO answer建议我必须将我不想做的 BlockJUnit4ClassRunner 子类化。

动态指定的测试套件似乎必须在 JUnit 4 的某个地方。有谁知道在哪里?

最佳答案

要创建动态测试套件,您需要使用 @RunWith 注释。常用的使用方法有两种:

@RunWith(Suite.class)

这允许您指定哪些类组成了相关的测试套件。这相当于 JUnit 3 风格:

import junit.framework.TestSuite;
import junit.framework.TestCase;

public final class MasterTester extends TestCase {

  public static TestSuite suite() {
    TestSuite suite = new TestSuite();
    suite.addTestSuite(TestClass1.class);        
    suite.addTestSuite(TestClass2.class);
    // etc...
    return suite;
  }
}

等效的 JUnit 4 类将是:

import org.junit.runners.Suite;

@RunWith(Suite.class)
@SuiteClasses({TestClass1.class, TestClass2.class})
public final class MasterTester {

}

@RunWith(AllTests.class)

这允许您动态指定组成测试套件的测试。如果您的测试直到运行时才知道,您不能在注释中指定它们。您可以改用这种结构。所以,如果 JUnit 3 代码是:

import junit.framework.TestCase;
import junit.framework.TestSuite;
import junit.framework.Test;

public final class MasterTester extends TestCase {

  public static TestSuite suite() {
    TestSuite suite = new TestSuite();
    for (Test test : findAllTestCasesRuntime()) {
      suite.addTest(test);
    }
    return suite;
  }
}

等效的 JUnit 4 代码将是:

import org.junit.runners.AllTests;
import junit.framework.TestSuite;
import junit.framework.Test;

@RunWith(AllTests.class)
public final class MasterTester {

  public static TestSuite suite() {
    TestSuite suite = new TestSuite();
    for (Test test : findAllTestCasesRuntime()) {
      suite.addTest(test);
    }
    return suite;
  }
}

关于java - 如何在 JUnit 4 中动态创建测试套件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3257080/

相关文章:

java - 有什么方法可以让 Eclipse 始终使用常见的 VM args 来运行 JUnit 测试?

spring - 将 Spring bean 注入(inject) JUnit Jupiter 中的 ParameterResolver

java - Spring 3.x 无法加载 applicationContext

java - GridLayout 的程序逻辑错误

java - 运行多个线程并在异常时停止线程

java - 在 GET METHOD Spring 带注释的 Controller 上添加错误

java - 如何将 CategoryFilter 传递给 JUnitcore?

java - 获取 Android 内部(私有(private))存储的任意子目录中的文件列表

java - 为 JAva Web 应用程序编写自动化测试的最佳方法是什么

junit4 - Spring WS + JAXB 测试