根据参数化Junit测试用例中的不同参数更改断言行为

时间:2012-09-11 10:16:17

标签: java junit junit4

是否可以根据@Parameters方法的参数更改断言行为。

Class abcTest
{
  ..
  @Parameters
  public static Collection<Object[]> testParameters()
  {
        return Arrays.asList(new Object[][] {
        {1},{2} 
        });
  }

  ..
  @Test
  public void test()
  {
    ...
    if(num == 1) { assertTrue(..); }
    if(num == 2) { assertFalse(..); }
    ...
  }
}

是否可以完全按照我们定义参数的方式定义断言行为?

提前致谢。

2 个答案:

答案 0 :(得分:4)

在最简单的情况下,您可以将期望值作为参数传递,并在断言中使用它们,如javadoc所示。

在更复杂的情况下,您需要将断言逻辑封装到对象中并将它们作为参数传递。

如果您对相同的值需要不同的断言,可以使用assertThat()Matcher<T>

class abcTest
{
  @Parameters
  public static Collection<Object[]> testParameters()
  {
        return Arrays.asList(new Object[][] {
            {1, CoreMatchers.is(true)},
            {2, CoreMatchers.is(false)} 
        });
  }

  ..
  @Test
  public void test()
  {
      ...
      assertThat(value, matcher);
  }
}

否则,如果不同的参数需要完全不同的断言,您可以将它们作为Runnable传递。

但是,在这种情况下使用参数化测试可能不是一个好主意 - 如果您需要针对不同情况使用完全不同的断言,那么为这些情况创建单独的测试方法会更加优雅,将它们的公共部分提取到辅助方法中:

@Test
public void shouldHandleCase1() {
   handleCase(1);
   assertTrue(...);
}

@Test
public void shouldHandleCase2() {
   handleCase(2);
   assertFalse(...);
}

答案 1 :(得分:0)

最近我开始了zohhak项目。它让你写的

@TestWith({
    "1, true",
    "2, false"
})
public void test(int value, boolean expectedResult) {
  assertThat(...).isEqualTo(expectedResult);
}