【问题标题】:JUnit: inject @Parameterized parameters?JUnit:注入@Parameterized参数?
【发布时间】:2015-02-10 19:04:35
【问题描述】:

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

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

如何注入自己的参数?

【问题讨论】:

  • 这看起来像an XY problem。公平地说,您的基本问题是:我怎样才能轻松地只运行在大型参数化测试中失败的测试?如果是这样,假设您正在尝试,您能否确认您正在使用哪个 IDE在 IDE 中实现这个目标?
  • 公平地说,我的基本问题是:虽然可以使用(例如)JUnitCore 运行测试类,但我怎样才能也传递参数以便它不会使用@Parameters 中给出的参数。?
  • 您能否提供更多有关“注入我自己的参数”含义的信息。
  • 假设我现在想要一个类来运行这个测试类的测试,但是我指定了一个给定的 Object[]。

标签: java junit parameterized parameterized-unit-test


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我会使用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[]>();
      }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 2019-01-22
      • 2018-05-15
      相关资源
      最近更新 更多