【问题标题】:how to combine @RunWith with @RunWith(Parameterized.class)如何将@RunWith 与@RunWith(Parameterized.class) 结合使用
【发布时间】:2015-01-02 17:01:19
【问题描述】:

我实现了一个从 BlockJUnit4ClassRunner 继承的运行程序类 A.class,以便我可以使用 @RunWith(A.class) 注释测试。同时,某人。否则使用 RunWith(Parameterized.class) 注释测试。很明显我们不能同时使用两个@RunWith。

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

【问题讨论】:

    标签: junit junit-runner


    【解决方案1】:

    我相信这是你想要的:

    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

    【讨论】:

    • 感谢您的回答。但是在您的代码中,我无法弄清楚我的 A.class 在哪里?
    • public static class Runner extends BlockJUnit4ClassRunnerWithParameters 和你的 A.class 一样,可以是你自定义的 runner 实现(并且支持参数化)
    • @Stefan,这个修改后的版本将不起作用,因为自定义运行器必须扩展 BlockJUnit4ClassRunnerWithParameters 以支持参数化。我相信我的原始示例正是原始问题所要求的,我只是将自定义跑步者命名为 Runner 而不是 A
    • 它不必扩展BlockJUnit4ClassRunnerWithParameters。此功能旨在重用现有运行器而不修改它们。因此,您可以通过注入参数的机制简单地扩展您当前的运行器A
    • @user389955,啊,看起来他们在4.12 中添加了ParametersRunnerFactory,所以看起来这个可定制的参数化的东西很新。希望您能够将您的 JUnit 更新到最新版本
    猜你喜欢
    • 2019-07-14
    • 1970-01-01
    • 2018-08-20
    • 2021-06-22
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多