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

Java 这是在通用方法中调用Junit断言的好方法吗?,java,junit,Java,Junit,我编写了一些测试,这些测试调用一个方法来查找给定1到n数组中缺少的数字。测试代码如下所示: public class MissingNumberInArrayTest { private int arrElements; private int[] arr; @Test public void mustReturnMissingNumberCase1() { // Given arrElements = 5; a

我编写了一些测试,这些测试调用一个方法来查找给定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);
    }

}

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

这个问题没有确切的答案(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);
    }
}
@RunWith(Parameterized.class)
公共类缺少NumberArraytest{
@参数化。参数化
公共静态收集数据(){
返回Arrays.asList(新对象[][]{
{5,新int[]{1,2,3,4,5},
{5,新int[]{2,3,4,5},1}
});
}
@参数化。参数(0)
公共设施;
@参数化。参数(1)
公共int[]arr;
@参数化。参数(2)
公众期望;
@试验
public void mustReturnMissingNumberCase(){
//什么时候
int missingNumber=MissingNumberInArray.findAdministringNumber(arr,arElements);
//然后
资产质量(预计,缺失数量);
}
}

当断言失败时,您可以查看JUnit文档

,如何在不检查堆栈跟踪的情况下知道错误?(这不像第10行的失败那么直接…-它们都会在同一行失败,你必须沿着堆栈跟踪走到调用的位置,然后去“啊,这就是问题所在”.@MrR即使断言直接在测试用例内部,您如何在不检查堆栈跟踪的情况下知道它们失败的地方?您在这里所做的是编写一个断言方法,如
assertEquals
assertSame
等,专门针对您的用例。如果这是您发现最清晰地表达测试意图的方法测试,这很好;它不像我在方法中使用的代码那么常见,但这是我个人的偏好。我唯一要改变的是更好地命名方法。@JUnit先生告诉你哪种测试方法失败了。这个问题没有确切的答案。它太固执己见了。我个人不会对像这样的简单案例这么做。但没有什么可以解决的如果它能让您的生活更轻松,那么原则上它是错误的。对于您的示例,更好的解决方案是使用参数化测试: