Java JUnit测试无法找到要测试的类
我目前正在为一个简单的方法编写一个JUnit单元测试用例。以下是所讨论的方法:Java JUnit测试无法找到要测试的类,java,unit-testing,junit,Java,Unit Testing,Junit,我目前正在为一个简单的方法编写一个JUnit单元测试用例。以下是所讨论的方法: public static Integer[] findUnpairedNumbers(Integer[] numbers) { // catches if passed array is empty or uninitialized if (numbers == null) { throw new IllegalArgumentException(); } // H
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()]);
}
但是,测试类无法识别
findUnpairedNumbers
类。它在同一个包裹里。我还需要进口什么吗?我哪里出了问题
另外,请让我知道是否有任何语法是非正统的,或者是否有其他方法可以改进我的测试用例
但是,测试类无法识别findUnpairedNumbers类。它在同一个包裹里。我还需要进口什么吗
findUnpairedNumbers
是某个类的静态方法。为了调用它,您必须指定它存在于哪个类中
像这样:
Integer[] unpaired = NameOfTheClass.findUnpairedNumbers(numbers);
试验方法
另外,请让我知道是否有任何语法是非正统的,或者是否有其他方法可以改进我的测试用例
不要直接使用fail()
。通常,我们在测试的断言阶段从JUnit调用assertSomething()
方法(例如assertEquals()
)。在您的情况下,我建议assertarayequals()
:
注意测试是如何变得更干净的。
我还建议您将测试方法名称重命名为更能描述行为的名称:
@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 {
- 另一个选项是使用
方法的findUnpairedNumbers
导入。如果遵循此路径,则在调用它时不需要前缀(就像调用当前类中声明的静态方法一样调用它)静态
obj.findUnpairedNumbers()
YourClass.findUnpairedNumbers()
您是否已将JUnit库添加到类路径中?我已添加。我以前写过JUnit测试,但用于非常不同的东西。我想这一条的简单让我很困惑。您应该创建一个对象来调用要在testClass中测试的方法,然后调用方法obj.findUnpairedNumbers()或2。您应该使被调用的方法成为静态的,并调用您的class.findUnpairedNumbers()旁注:您应该花更多的时间阅读编译器错误消息。java编译器非常擅长指出源代码中的错误。通常,人们不需要Stackoverflow来理解错误。一个人只需要逐字阅读错误信息;旋转编译器指出的行,并阅读。。。逐字逐句。
findUnpairedNumbers
是一种方法,而不是类。。。在一个类中确实有这个方法,对吗?如果它与测试类不在同一个包中,那么您还需要使用完整的类名来引用它。我真不敢相信我错过了。非常感谢。测试正在运行(尽管失败了),我会把它敲定。非常感谢。您可能希望添加另一个选项:对方法使用静态导入;避免将类名放在调用前面。旁注:始终仔细检查人们在代码中做什么。他的方法已经是静态的。给出代码的实际答案比给出一般答案要好。
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();
}
}
}
package someOtherPackage;
import program.FindUnpaired;
public class FindUnpairedTest {
import static program.FindUnpaired.findUnpairedNumbers; // static import
public class FindUnpairedTest {
...
Integer[] unpaired = findUnpairedNumbers(numbers); // no need to prefix