JUnit:注入@Parameterized参数?

时间:2015-02-10 19:04:35

标签: java junit parameterized parameterized-unit-test

将一组参数注入@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,...);

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

如何注入自己的参数?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:-1)

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

@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[]>();
  }
}

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