0

将一组参数注入@Parameterized 测试类的最简单方法是什么?

用例:

我有一个看起来像这样的普通班

@RunWith(Parameterized.class)
class Tests {

    public void testOne() { }
    public void testTwo() { }

    @Parameters
    public static Collection<Object[]> generateData() { }

}

可以像这样调用标准的 JUnit 运行器: org.junit.runner.JUnitCore.runClasses(TestClass1.class, ...);

但是,没有办法指定/覆盖参数。

如何注入自己的参数?

4

2 回答 2

0

junit 不是为使用您的参数运行其他人的 junit 类而设计的。所以如果可能的话,重构你的测试类,使它们支持你想要的行为。如果你不能重构,那么你所能做的就是使用一些变通方法。例如:

  • 如果测试类写得“正确”(例如没有静态引用),那么您可以从测试类继承并提供您自己的参数。但是您仍然必须在类文件中显式提供参数,而不是在运行期间
  • 您可以尝试使用自定义类加载器和字节码生成/转换来更改类加载时的参数提供程序方法。与 PowerMockito 的工作方式相同
  • 为您编写自定义运行程序,以便它忽略类内参数并使用您自己的参数
于 2015-04-24T20:18:07.990 回答
-1

我会使用一种generateData()生成所有五百个元素的方法。另外,我会添加一个getParameters()@Parameters. 它可以调用generateData()以获取完整的集合,然后加载日志文件(如果存在)并将集合减少到失败的测试参数。如果不存在日志文件,它将返回整个集合。您可能需要显式命名参数才能识别它们,因为 JUnit 不能保证以相同的顺序重新运行测试/测试参数(请参阅更改参数化测试的名称)。

@RunWith(Parameterized.class)
public class Tests {

  @Parameters
  public static Collection<Object[]> getParameters() {
    List<Object[]> parameters = generateData();
    return filterParameters(parameters);
  }

  private static Collection<Object[]> filterParameters(Collection<Object[]> params) {
    // load a file to exclude successful tests
    // ...
  }

  private static Collection<Object[]> generateData() {
    return new ArrayList<Object[]>();
  }
}

另一种方法可能是在方法中使用Scannerwith ,以便您可以使用控制台中的用户输入来选择参数。但是,如果您想在持续集成中使用它们,您将需要以某种方式确保在没有用户交互的情况下仍然可以运行测试。System.in@Parameters

于 2015-02-10T21:30:52.433 回答