这是在通用方法中调用 Junit 断言的好方法吗?

is this a good way to call Junit assertions in a common method?

我已经编写了测试,它调用一种方法来查找给定的 1 到 n 数组中缺失的数字。测试代码如下:

public class MissingNumberInArrayTest {

    private int arrElements;
    private int[] arr;

    @Test
    public void mustReturnMissingNumberCase1() {
        // Given
        arrElements = 5;
        arr = new int[]{1, 2, 3, 4};

        // When & Then
        callAssertion(arr, arrElements, 5);

    }

    @Test
    public void mustReturnMissingNumberCase2() {
        // Given
        arrElements = 5;
        arr = new int[]{2, 3, 4, 5};

        // When & Then
        callAssertion(arr, arrElements, 1);

    }

    public void callAssertion(int[] arr, int arrElements, int expected) {
        // When
        int missingNumber = MissingNumberInArray.findMissingNumber(arr, arrElements);

        // Then
        Assertions.assertEquals(expected, missingNumber);
    }

}

如您所见,我有多个案例要测试,并且在接受输入和断言数据的通用方法中使用了断言。这是编写测试的好方法吗?

这个问题没有确切的答案 (IMO),所以它可能很快就会被删除。

对于像您的示例这样的简单案例,我不会这样做,但如果它能让您的生活更轻松,我认为它没有任何问题。您可以将该方法重命名为 assertMissingNumber,它与通常的方法没有太大区别(尽管您真正想要测试的方法在断言调用中)。

不过,我认为您的具体示例非常适合参数化测试。

这是 Junit 4 的样子:

@RunWith( Parameterized.class )
public class MissingNumberInArrayTest {

    @Parameterized.Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList( new Object[][] {
                { 5, new int[]{1, 2, 3, 4}, 5},
                { 5, new int[]{2, 3, 4, 5}, 1}
        });
    }

    @Parameterized.Parameter(0)
    public int arrElements;

    @Parameterized.Parameter(1)
    public int[] arr;

    @Parameterized.Parameter(2)
    public int expected;

    @Test
    public void mustReturnMissingNumberCase() {
        // When
        int missingNumber = MissingNumberInArray.findMissingNumber(arr, arrElements);

        // Then
        assertEquals( expected, missingNumber);
    }
}

您可以查看 JUnit 文档 for examples with JUnit 5