java如何使用ParameterizeTest中参数的嵌套属性定义显示名称(名称=#{index}乘法{0[0]}x{0[1]}={0[2]})
我不知道这是否是缺少的特性,请参见JUnit issue 1154和my comment,或者我无法正确编写JUnit5中@ParameterizedTest
的名称的语法。考虑到这个问题在过去三年中一直存在,我恐怕等不及得到答案,甚至是在那里的实施,所以我也在这里尝试提问
在我的示例ParameterizedTest中,我使用了@MethodSource
,它返回一个ints数组流,我只想使用这些数组的属性,而不是所有的{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]}"
但这在句法上是不正确的
# 1 楼答案
好的,正如@Murat Karagöz所建议的,我只在Github上转发我收到的所有建议
在我看来,毫无疑问,这些优雅的解决方案只是解决了JUnit5@ParameterizedTest的API限制,但它们都满足了我的需求
如果我不需要使用^{,建议的解决方案#1
这里给出的解决方案是保留
@MethodSource("data")
,只改变其返回类型。现在data()
方法返回参数流对象(每个对象中有3个),而不是int数组流(每个对象中有3个)然后代码是:
对于his post @ Github,学分归Marc Philipp
建议的解决方案#2展开测试数据以匹配显示需求##
由sormarus提供的^{em>This solution建议使用
@CsvSource
而不是@MethodSource
,并在注释中提供测试数据集我喜欢这个简单的例子,如何在不需要特定数据生成方法的情况下快速准备相同的基本变量
代码如下所示: