是否可以将参数化测试与jUnit中的非参数化测试结合起来?

时间:2016-05-05 13:55:14

标签: java unit-testing junit

用例如下,我希望能够将参数化和非参数化测试结合起来,并为不同的参数化测试提供不同的参数。

使用Parameterized.class似乎有点过分,因为这会炸掉我需要参数化的每个新单元测试的构造函数,也会导致我不感兴趣的非参数化测试的多次运行。

所以我在考虑Theories.class,但是虽然可以提供多个@DataPoint,但这些是指作为每个参数传递给测试函数的各个类型,并且仍然只导致测试一个函数。 / p>

我想实现像

这样的东西
@RunWith(Theories.class)
class Test{
    @Theory(named="foo")
    public void fooTest(Object input) { 
    }

    public static @DataPoints(named="foo") Object[] inputs = {1, 2, 3, 4, 5};

    @Theory(named="bar")
    public void barTest(Object input) { 
    }

    public static @DataPoints(named="bar") Object[] inputs = {6, 7, 8, 9, 10};

    public void bazTest() {
    }
}

fooTest分别使用1, 2, 3, 4, 5barTest 6, 7, 8, 9, 10进行测试。

有没有办法使用Theory来实现这一目标?有没有替代方案来实现这一目标?

2 个答案:

答案 0 :(得分:1)

你不能将测试风格与Theories runner混合使用。但是可以以这种方式使用某些第三方参数化运行程序,例如JUnitParams

e.g

@RunWith(JUnitParamsRunner.class)
public class PersonTest {

  @Test
  @Parameters({"17, false", 
               "22, true" })
  public void personIsAdult(int age, boolean valid) throws Exception {
    assertThat(new Person(age).isAdult(), is(valid));
  }

  @Test
  public void lookNoParams() {
    etc
  }

}

答案 1 :(得分:0)

JUnit 5 引入了 ParameterizedTest (doc):

@ParameterizedTest
@ValueSource(ints = {2, 4, 6})
public void isEven(Integer val) {
    assertTrue(val % 2 == 0);
}

This 是一个不错的教程。