是否可以根据@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(..); }
...
}
}
是否可以完全按照我们定义参数的方式定义断言行为?
提前致谢。
答案 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);
}