我目前正在编写一个简单方法的JUnit单元测试用例。这是有问题的方法:
public static Integer[] findUnpairedNumbers(Integer[] numbers) {
// catches if passed array is empty or uninitialized
if (numbers == null) {
throw new IllegalArgumentException();
}
// HashSet initialized to store unpaired numbers
HashSet<Integer> result = new HashSet<Integer>();
// Loop through numbers array
for (int next: numbers) {
// if HashSet already contains next element, remove that element from the HashSet
if (result.contains(next)) {
result.remove(next);
}
// Otherwise, add it to the HashSet
else {
result.add(next);
}
}
// return the HashSet of unpaired numbers, converting to back to Integer array
return result.toArray(new Integer[result.size()]);
}
这是我写的JUnit测试:
package program;
import static org.junit.Assert.*;
import org.junit.Test;
public class FindUnpairedTest {
@Test
public void test() {
Integer[] numbers = {1, 2, 4, 5, 7, 7, 8, 8, 9, 1, 5};
Integer[] unpairedCheck = {2, 4};
Integer[] unpaired = findUnpairedNumbers(numbers);
if (unpaired != unpairedCheck) {
fail();
}
}
}
但是,测试类无法识别findUnpairedNumbers
类。它在同一个包中。我还需要进口其他东西吗?我在哪里错了?
另外请告诉我,如果任何语法是非正统的,或者我还有其他方法可以改进我的测试用例。
答案 0 :(得分:3)
但是,测试类无法识别findUnpairedNumbers类。它在同一个包中。我还需要进口其他东西吗?
findUnpairedNumbers
是某些类的静态方法。要调用它,您必须指定它存在于哪个类中。
像这样:
Integer[] unpaired = NameOfTheClass.findUnpairedNumbers(numbers);
另外请告诉我,如果任何语法是非正统的,或者我还有其他方法可以改进我的测试用例。
不要直接使用fail()
。通常,我们在测试的断言阶段从JUnit调用assertSomething()
方法(例如assertEquals()
)。在您的情况下,我建议assertArrayEquals()
:
@Test
public void test() {
Integer[] numbers = {1, 2, 4, 5, 7, 7, 8, 8, 9, 1, 5};
Integer[] unpaired = findUnpairedNumbers(numbers);
Integer[] expectedUnpaired = {2, 4};
assertArrayEquals(expectedUnpaired, unpaired);
}
注意测试如何变得更清洁。 我还建议您将测试方法名称重命名为更能描述行为的内容:
@Test
public void findUnpairedNumbersLeavesOnlyNumbersWithoutPairs() { ...
这将使维护者更容易获得测试的意图和预期的行为(如果将来失败)。
更完整的解释/示例:
假设findUnpairedNumbers
方法属于名为FindUnpaired
的类:
package program;
public class FindUnpaired {
public static Integer[] findUnpairedNumbers(Integer[] numbers) {
...
return result.toArray(new Integer[result.size()]);
}
}
现在,在您的测试类中,您可以使用它:
package program;
import static org.junit.Assert.*;
import org.junit.Test;
public class FindUnpairedTest {
@Test
public void test() {
Integer[] numbers = {1, 2, 4, 5, 7, 7, 8, 8, 9, 1, 5};
Integer[] unpairedCheck = {2, 4};
Integer[] unpaired = FindUnpaired.findUnpairedNumbers(numbers);
// ^^^^^^^^^^^^----------------------------------- changed here
if (unpaired != unpairedCheck) {
fail();
}
}
}
其他考虑因素:
您可以直接使用FindUnpaired
,因为我们假设测试类位于同一个包中。如果软件包不同,您必须在测试类中导入FindUnpaired
。
package someOtherPackage;
import program.FindUnpaired;
public class FindUnpairedTest {
另一种选择是使用static
方法的 findUnpairedNumbers
导入。如果你遵循这条路线,你在调用它时不需要加前缀(称之为它是当前类中声明的静态方法)。
import static program.FindUnpaired.findUnpairedNumbers; // static import
public class FindUnpairedTest {
...
Integer[] unpaired = findUnpairedNumbers(numbers); // no need to prefix
答案 1 :(得分:0)
obj.findUnpairedNumbers()
或
YourClass.findUnpairedNumbers()