这是在通用方法中调用 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
我已经编写了测试,它调用一种方法来查找给定的 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