Java 如何使用ParameteredTest中参数的嵌套属性定义显示名称(名称=#{index}乘法{0[0]}x{0[1]}={0[2]})

Java 如何使用ParameteredTest中参数的嵌套属性定义显示名称(名称=#{index}乘法{0[0]}x{0[1]}={0[2]}),java,junit5,parametrized-testing,Java,Junit5,Parametrized Testing,我无法确定这是否是缺少的功能,请参见and there,或者只是我无法正确编写JUnit5中@parameteredTest的名称的语法。考虑到这个问题在过去三年中一直存在,我恐怕不能等到我得到答案,甚至是那里的实施,所以我也想在这里提问 在我的示例ParameterizedTest中,我使用的是@MethodSource,它返回一个int数组流,我只想使用这些数组的属性,而不是所有{arguments},如果我使用{0},这些属性都是相同的。这里难以口头解释,最好使用下面的代码示例 packa

我无法确定这是否是缺少的功能,请参见and there,或者只是我无法正确编写JUnit5中
@parameteredTest
名称的语法。考虑到这个问题在过去三年中一直存在,我恐怕不能等到我得到答案,甚至是那里的实施,所以我也想在这里提问

在我的示例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;
        }
    }
}

package net.delphym.unittests;
导入org.junit.jupiter.api.DisplayName;
导入org.junit.jupiter.params.ParameterizeTest;
导入org.junit.jupiter.params.provider.MethodSource;
导入java.util.stream.stream;
导入静态org.junit.jupiter.api.Assertions.assertEquals;
类DynamicTestCreationTestParam{
私有静态流数据(){
返回流.of(新的int[][{{1,2,2},{5,3,15},{121,4484});
}
@DisplayName(“乘法测试”)
@ParameterizeTest(name=“{arguments}:{0}x{1}={2}”的{index}”)
@方法来源(“数据”)
void testWithStringParameter(int[]数据){
MyClass tester=新的MyClass();
int m1=数据[0];
int m2=数据[1];
int预期=数据[2];
资产质量(预期,测试人员乘以(m1,m2));
}
//待测类别
类MyClass{
公共整数乘法(整数i,整数j){
返回i*j;
}
}
}
第一次运行的测试结果输出类似于这样:
#1 for[1,2,2]:[1,2,2]x{1}={2}

理想情况下,我希望看到这样的情况:
#1乘法:1 x 2=2

所以问题是什么是符合我期望的
@参数化测试(
名称
定义

我试着这样做:
name=“#{index}乘法:{[0][0]}x{[0][1]}={[0][2]}”
但它在语法上是不正确的。

好吧,正如所建议的,我只是把我收到的建议转载到一个地方

在我看来,毫无疑问,这些优雅的解决方案只是解决JUnit5@ParameterizedTest
API限制的变通方法,但它们都满足了我的需求

如果我不需要使用
int[]
这里介绍的解决方案是保留
@MethodSource(“数据”)
,只更改其返回类型。现在
data()
方法返回参数流对象(每个对象3个),而不是int数组流(每个对象3个)

然后代码是:

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));
}

GitHub上的人非常活跃,他们为我的需求提供了很好的解决方案。只需查看我的一篇文章下面的几篇文章:正如我所说的,这是一种更为有效的解决方法,如果现在它是JUnit5的局限性,或者当
int[]
作为一个参数传入时,它可以以某种方式实现,您仍然可以发布该解决方法作为答案。总比没有好。
    @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));
    }