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都失败了。这个解释非常有意义。