2

我的设置:

  Netbeans 6.7
  Java6
  JUnit 4.5 added as the Test libraries

当我尝试传入两个类数组(转换为 Object[])时,我收到错误“找不到符号”,并且我的测试用例无法编译。

我对其他断言语句没有意见,正如我所说,我正在使用 JUnit 4.5 库。

有没有人知道如何解决这个问题,或者观察到这种古怪的行为?

Netbeans 能够通过其自动完成功能找到此函数声明,但无法找到它所在的位置,也无法导航到源。

示例代码:

CustomObject[] coa = { new CustomObject() ....}
CustomObject[] expected = { new CustomObject() ... } 
assertArrayEquals((Object[])coa, (Object[])expected);
4

4 回答 4

3

好吧, Assert.assertArrayEquals 是一个静态方法,正如您从正在运行的代码中看到的那样:

 org.junit.Assert.assertArrayEquals(....)

但是在您提供的代码中,您试图将其用作实例方法:

 assertArrayEquals((Object[])coa, (Object[])expected);

仅当您静态导入Assert.*Assert.assertArrayEquals.

现在,如果您的其他断言正在工作,我的猜测是您仍在派生TestCase(即编写 JUnit 测试的“旧”方式)并且您的断言正在调用TestCase.assertEquals等。

如果您可以给出一个简短但完整的单元测试示例,其中一个断言有效但assertArrayEquals无效,我们可能会弄清楚发生了什么。

于 2009-10-12T06:28:26.033 回答
1

您不需要完全限定断言或将数组转换为对象数组。只需导入 JUnit 的适当部分并直接传入您的数组。不过,您应该将示例中的参数顺序颠倒过来——您的期望是第一位的(“预期的”),您从测试中实际得到的是第二的(“实际的”)。这工作正常:

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 {}
}
于 2009-10-12T06:15:47.387 回答
0

问题是编译器拒绝查看实际的类..但它会使用绝对路径:org.junit.Assert.assertArrayEquals(....

我可能会补充说相当烦人。

于 2009-10-12T05:49:47.843 回答
0

我喜欢 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;
    }
}
于 2013-09-28T18:57:05.680 回答