JUnit 5参数化测试中如何传递期望值和实际值

vvppvyoh  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(223)

我正在尝试实现参数化测试,其中我有一组输入值和期望值,我希望使用JUnitassertEquals方法测试这些值。我使用JUnit版本5.x进行此测试我将输入值传递给在其他包(我正在测试的包)中定义的自定义方法,并使用assertEquals方法使用期望值检查它。

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.Arrays;
import java.util.Collection;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.runners.Parameterized.Parameters;

class StringHelperTest {
    private StringHelper helper = new StringHelper();
    private String input;
    private String expectedOutput;

    public String getInput() {
        return input;
    }

    public void setInput(String input) {
        this.input = input;
    }

    public String getExpectedOutput() {
        return expectedOutput;
    }

    public void setExpectedOutput(String expectedOutput) {
        this.expectedOutput = expectedOutput;
    }

    @Parameters
    public static Collection<String[]> testConditions() {
        String[][] expectedOutputs = { { "AACD", "CD" }, { "ACD", "CD" }, { "CDEF", "CDEF" }, { "CDAA", "CDAA" } };
        return Arrays.asList(expectedOutputs);
    }

    @ParameterizedTest
    @Test
    public void truncateAInFirst2Positions_A_atStart() {
        assertEquals(expectedOutput, helper.truncateAInFirst2Positions(input));

    }
}

testConditions()方法中,实际值和预期值以二维字符串数组expectedOutputs {{<actual_value>,<expected_value>},{...}}的形式给出。
如何将expectedOutputs数组传递给truncateAInFirst2Positions_A_atStart()方法,以测试expectedOutputs数组中提到的所有条件

qv7cva1a

qv7cva1a1#

在JUnit 5中,您有ParameterizedTest和一个用于输入参数的Source,这些参数就是方法的简单参数。
因此,您需要一个具有以下签名的方法:

@ParameterizedTest
//Source Annotation
void truncateAInFirst2Positions_A_atStart(String actual, String expected) {

现在,您可以查找用例匹配源。当您希望通过方法提供测试数据时,可以使用@MethodSource("testConditions")。注解中的String指向提供测试数据的静态方法。测试将执行x次,其中x是集合中的对的计数。String Array中的元素将用作方法参数。
对于字符串这样的简单类型,CSV源可以更简单、更容易阅读:

@CsvSource({
"AACD, CD",
"ACD, CD"
})

您可以在官方文档中检查所有可能的来源和可能性:https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests

v64noz0r

v64noz0r2#

因为问题已经回答过了,所以仅供参考,但如果您需要字符串以外的其他内容(例如您自己的对象),则可以使用org.junit.jupiter.params.provider.Arguments.arguments,例如:

@ParameterizedTest
@MethodSource("provideMyObject")
void myTestMethod(ActualObject actual, ExpectedObject expected) {
   // ...
}

static Stream<Arguments> provideMyObject() {
    return Stream.of(
            org.junit.jupiter.params.provider.Arguments.arguments(new ActualObject("foo"), new ExpectedObject("foo")),
            org.junit.jupiter.params.provider.Arguments.arguments(new ActualObject("bar"), new ExpectedObject("bar))
    );
}

另请参阅:https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests-sources-MethodSource

相关问题