有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我不知道这是否是缺少的特性,请参见JUnit issue 1154my 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) 个答案

  1. # 1 楼答案

    好的,正如@Murat Karagöz所建议的,我只在Github上转发我收到的所有建议

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

    如果我不需要使用^{,建议的解决方案#1

    这里给出的解决方案是保留@MethodSource("data"),只改变其返回类型。现在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));
    }
    

    对于his post @ Github,学分归Marc Philipp

    建议的解决方案#2展开测试数据以匹配显示需求##

    sormarus提供的^{em>This solution建议使用@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));
        }