我不知道这是一个缺失的功能,请参阅JUnit问题1154和我在那里的评论,还是我无法正确编写JUnit5中@ParameterizedTest
的name的语法。考虑到这个问题在过去三年里一直悬而未决,恐怕我等不及得到答案,甚至不能等到那里的实施,所以我也试着在这里提问。
在我的示例ParameterizedTest中,我使用的是@MethodSource
,它返回一个int数组流,我希望只使用这些数组的属性,而不是所有的{arguments}
,如果我使用{0}
,它无论如何都是相同的。这里很难口头解释,最好使用下面的代码示例。
package net.delphym.unittests;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.assertEquals;
class DynamicTestCreationTestParam {
private static Stream<int[]> data() {
return Stream.of(new int[][] { {1, 2, 2}, {5, 3, 15}, {121, 4, 484} });
}
@DisplayName("Multiplication test")
@ParameterizedTest(name = "#{index} for {arguments}: {0} x {1} = {2}")
@MethodSource("data")
void testWithStringParameter(int[] data) {
MyClass tester = new MyClass();
int m1 = data[0];
int m2 = data[1];
int expected = data[2];
assertEquals(expected, tester.multiply(m1, m2));
}
// class to be tested
class MyClass {
public int multiply(int i, int j) {
return i *j;
}
}
}
第一次运行的测试结果输出如下:#1 for [1, 2, 2]: [1, 2, 2] x {1} = {2}
理想情况下,我希望看到这个:#1 multiply: 1 x 2 = 2
。
所以,问题是@ParametrizedTest(
的名称)
的定义是什么才能符合我的期望?
我在尝试这样的东西:name = "#{index} multiply : {[0][0]} x {[0][1]} = {[0][2]}"
但它在语法上是不正确的。
好吧,正如@Murat Karagöz所建议的,我只是转发我在Github上收到的所有建议。
在我看来,毫无疑问,这些优雅的解决方案只是JUnit5@ParameterizedTestAPI限制的变通方法,但它们都满足了我的需求。
如果我不需要使用int[]
,建议的解决方法#1
这里给出的解决方案是保留@MethodSource("data")
,只更改其返回类型。现在,data()
方法返回参数流对象(每个对象中有3个(,而不是int数组流TR
然后代码显示:
private static Stream<Arguments> data() {
return Stream.of(Arguments.of(1, 2, 2), Arguments.of(5, 3, 15), Arguments.of(121, 4, 484));
}
@DisplayName("Multiplication test")
@ParameterizedTest(name = "#{index}: {0} x {1} = {2}")
@MethodSource("data")
void testWithStringParameter(int m1, int m2, int expected) {
MyClass tester = new MyClass();
assertEquals(expected, tester.multiply(m1, m2));
}
Marc Philipp的帖子@Github值得称赞。
建议的解决方法#2,用于展开测试数据以匹配显示需求##
sormarus提供的这个解决方案建议使用@CsvSource
而不是@MethodSource
,并在注释中提供一组测试数据
我喜欢这个简单的例子,如何在不需要特定数据生成方法的情况下快速准备相同的基本变体。
代码如下:
@DisplayName("Multiplication test")
@ParameterizedTest(name = "#{index} multiply: {0} x {1} = {2}")
@CsvSource({"1,2,2", "3,5,15", "121,4,484"})
void testWithStringParameter(int m1, int m2, int expected) {
MyClass tester = new MyClass();
assertEquals(expected, tester.multiply(m1, m2));
}