如何将@RunWith与@RunWith(Parameterized.class)结合使用

10

我实现了一个继承自BlockJUnit4ClassRunner的运行器类A.class,这样我就可以使用@RunWith(A.class)来给测试用例加注解。同时,其他人使用RunWith(Parameterized.class)来给测试用例加注解。很明显我们不能同时使用两个@RunWith。

如何解决这个问题?或者如何合并这两个@RunWith?

1个回答

13

我相信这可以满足您的需求:

package so.junit.runner;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.model.InitializationError;
import org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters;
import org.junit.runners.parameterized.ParametersRunnerFactory;
import org.junit.runners.parameterized.TestWithParameters;

import java.util.Arrays;

@RunWith(Parameterized.class)
@Parameterized.UseParametersRunnerFactory(CustomParameterizedTest.RunnerFactory.class)
public class CustomParameterizedTest {

  @Parameterized.Parameters
  public static Iterable<Integer> data() {
    return Arrays.asList(new Integer[]{1, 2, 3});
  }

  private int i;

  public CustomParameterizedTest(int i) {
    this.i = i;
  }

  @Test
  public void test() {
    System.out.println(i);
  }

  public static class RunnerFactory implements ParametersRunnerFactory {
    @Override
    public org.junit.runner.Runner createRunnerForTestWithParameters(TestWithParameters test) throws InitializationError {
      return new A(test);
    }
  }

  public static class A extends BlockJUnit4ClassRunnerWithParameters {
    private final Object[] parameters;

    public A(TestWithParameters test) throws InitializationError {
      super(test);
      parameters = test.getParameters().toArray(new Object[test.getParameters().size()]);
    }

    @Override
    public Object createTest() throws Exception {
      return getTestClass().getOnlyConstructor().newInstance(parameters);
    }
  }
}

根据JUnit Parameterized类中的Javadocs,以下是他们期望您创建支持参数化的自定义测试运行器的方式。

更新

更新为将自定义运行器命名为A


我已经更正了这个例子。Runner类必须扩展您的A runner类。@Alex 希望这对您来说没问题。我不想创建一个新的答案。 - Stefan Birkner
1
@Stefan,这个修改后的版本不会工作,因为自定义运行器必须扩展 BlockJUnit4ClassRunnerWithParameters 以支持参数化。我相信我的原始示例正是原始问题所要求的,我只是将自定义运行器命名为“Runner”而不是“A”。 - Alex
2
它不必扩展BlockJUnit4ClassRunnerWithParameters。该功能旨在重用现有的运行器而无需修改它们。因此,您可以通过注入参数的机制简单地扩展当前的运行器A - Stefan Birkner
感谢Alex和Stefan。我无法运行代码,因为我的系统无法导入org.junit.runners.parameterized(显示找不到符号)。但我相信代码应该是正确的。所以我接受这个答案。 - user389955
1
@user389955,嗯,看起来他们在4.12版本中添加了“ParametersRunnerFactory”,因此这个可定制化的Parameterized东西似乎是相当新的。希望你能够将你的JUnit更新到最新版本。 - Alex
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接