Java 找不到AssertArrayQuals(对象[]o1,对象[]o2)
我的设置:Java 找不到AssertArrayQuals(对象[]o1,对象[]o2),java,testing,junit,junit4,Java,Testing,Junit,Junit4,我的设置: Netbeans 6.7 Java6 JUnit 4.5 added as the Test libraries 当我尝试传入两个类数组(cast-as-Object[])时,我得到错误“找不到符号”,并且我的测试用例将无法编译 我对其他assert语句没有异议,正如我所说,我正在使用JUnit4.5库 有没有人知道如何解决这个问题,或者观察到这种奇怪的行为 Netbeans可以通过其自动完成功能找到此函数声明,但无法找到其所在位置,也无法导航到源代码 示例代码: Cu
Netbeans 6.7
Java6
JUnit 4.5 added as the Test libraries
当我尝试传入两个类数组(cast-as-Object[])时,我得到错误“找不到符号”,并且我的测试用例将无法编译
我对其他assert语句没有异议,正如我所说,我正在使用JUnit4.5库
有没有人知道如何解决这个问题,或者观察到这种奇怪的行为
Netbeans可以通过其自动完成功能找到此函数声明,但无法找到其所在位置,也无法导航到源代码
示例代码:
CustomObject[] coa = { new CustomObject() ....}
CustomObject[] expected = { new CustomObject() ... }
assertArrayEquals((Object[])coa, (Object[])expected);
问题是编译器拒绝查看实际的类。。但它会有一条非常成功的道路: org.junit.Assert.assertArrayEquals(
我可能会补充说,这很烦人。您不需要完全限定断言或将数组强制转换为对象数组。只需导入JUnit的适当部分并直接传入数组。不过,您应该颠倒示例中的参数顺序-您期望的优先(“expecteds”),您从测试中实际得到的是第二个(“实际值”)。这很好:
import org.junit.*;
import static org.junit.Assert.*;
public class TestJUnitActuallyWorks {
@Test
public void myArraysShouldBeIdentical() {
CustomObject one = new CustomObject();
CustomObject two = new CustomObject();
CustomObject three = new CustomObject();
CustomObject[] expecteds = { one, two, three };
CustomObject[] actuals = { one, two, three };
assertArrayEquals(expecteds, actuals);
}
private static class CustomObject {}
}
好的,Assert.assertArrayEquals是一个静态方法,正如您可以从正在运行的代码中看到的:
org.junit.Assert.assertArrayEquals(....)
但在您给出的代码中,您试图将其用作实例方法:
assertArrayEquals((Object[])coa, (Object[])expected);
只有静态导入Assert.*
或Assert.assertarayequals
时,这才有效
现在,如果您的其他断言正在工作,我猜您仍然是从TestCase
(即编写JUnit测试的“旧”方式)派生出来的,并且您的断言正在调用TestCase.assertEquals
等
如果您可以给出一个简短但完整的单元测试示例,其中一个断言有效,但
assertArrayEquals
无效,那么我们可能会知道发生了什么。我喜欢SingleShot的答案,但他的两个数组实际上包含相同的对象。如果这些对象不是相同的实际对象呢(不同的对象具有相同的值,但应相等)
所以我想我会加强他的回答来展示如何做到这一点
@Test
public void myArraysShouldBeIdentical() {
CustomObject one1 = new CustomObject("one");
CustomObject two1 = new CustomObject("two");
CustomObject three1 = new CustomObject("three");
CustomObject one2 = new CustomObject("one");
CustomObject two2 = new CustomObject("two");
CustomObject three2 = new CustomObject("three");
CustomObject[] expecteds = { one1, two1, three1 };
CustomObject[] actuals = { one2, two2, three2 };
assertArrayEquals(expecteds, actuals);
}
private static class CustomObject {
public String value;
CustomObject(String inValue)
{
value = inValue;
}
@Override
public int hashCode() {
return value.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (obj == this)
return true;
if (!(obj instanceof CustomObject))
return false;
CustomObject rhs = (CustomObject) obj;
return value == rhs.value;
}
}
这没有任何意义。我没有任何重载方法匹配assertArrayEquals(Object[],Object[])在方法的范围内。该定义唯一存在的地方是org.junit.Assert。这就是我所做的,而编译似乎不想指向org.junit.Assert.*;类中的实现。所有AssertArrayQuals都失败了。这个解释非常有意义。