JUnit5 ParameterizedTest - 区分CsvSource参数集

时间:2018-03-31 06:41:23

标签: unit-testing junit5

问题:相同的测试方法用于不同的数据。根据输入数据,测试方法主体应该期望等于'或者'不等于'断言。

研究:@ParameterizedTest允许使用@CsvSource作为测试方法输入数据:

@ParameterizedTest
@CsvSource({ "foo, 1", "bar, 2", "'baz, qux', 3" })
void testWithCsvSource(String first, int second) {
  assertNotNull(first);
  assertNotEquals(0, second);
}

这可以通过两种相反的测试方法来实现,但它们的代码将非常相似。

问题:如何在方法体中识别当前使用哪组CsvSource输入参数

2 个答案:

答案 0 :(得分:1)

您可以使用不同的CsvSource创建两个测试方法,然后委托一个常用的测试方法。

@ParameterizedTest
@CsvSource({ "foo, 1", "bar, 2", "'baz, qux', 3" })
void testWithCsvSource(String first, int second) {
  internalTest(first, second);
}

@ParameterizedTest
@CsvSource({ "foo2, 1", "bar2, 2", "'baz2, qux2', 3" })
void testWithCsvSource2(String first, int second) {
  internalTest(first, second);
}

private void internalTest(String first, int second) {
  assertNotNull(first);
  assertNotEquals(0, second);
}

答案 1 :(得分:0)

到目前为止,最佳解决方案是将index作为每个集合的第一个参数:

@ParameterizedTest
@CsvSource({
  "0, foo, 11", // Expected to be valid.
  "1, bar, 22",  // Expected to be invalid.
  "2, 'baz, qux', 33" }) // Expected to be invalid.
void testWithCsvSource(
  int parametersIndex, 
  String first, 
  int second) {

  Assertions.assertEquals(
    second.validate(),
    parametersIndex == 0); // Expected true for 0 index parameters only.
}