assertArrayEquals (Object [] o1, Object [] o2) не может быть найден - PullRequest
2 голосов
/ 12 октября 2009

Моя настройка:

  Netbeans 6.7
  Java6
  JUnit 4.5 added as the Test libraries

Когда я пытаюсь передать два массива классов (приведенных как Object []), я получаю ошибку «не могу найти символ», и мой тестовый пример не будет компилироваться

У меня нет проблем с другими утверждениями assert, и, как я уже сказал, я использую библиотеки JUnit 4.5.

Кто-нибудь знает, как это исправить, или наблюдал это странное поведение?

Netbeans может найти это объявление функции через автозаполнение, но не может найти, где он находится, или может перейти к источникам.

Пример кода:

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

Ответы [ 4 ]

3 голосов
/ 12 октября 2009

Хорошо, Assert.assertArrayEquals - это статический метод, как вы можете видеть из своего кода, который работает:

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

Но в коде, который вы давали, вы пытались использовать его как метод экземпляра:

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

Это сработало бы, только если вы статически импортировали Assert.* или Assert.assertArrayEquals.

Теперь, если ваши другие утверждения работают, мое предположение заключается в том, что вы все еще наследуете TestCase (т. Е. "Старый" способ написания тестов JUnit) и что ваши утверждения вызывают TestCase.assertEquals и т. Д.

Если бы вы могли привести короткий, но полный пример модульного теста, в котором одно утверждение работает, но assertArrayEquals нет, мы, вероятно, могли бы разобраться, что происходит.

1 голос
/ 12 октября 2009

Вам не нужно полностью квалифицировать утверждение или приводить ваши массивы к массивам объектов. Просто импортируйте нужные части 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 {}
}
0 голосов
/ 28 сентября 2013

Мне нравится ответ 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;
    }
}
0 голосов
/ 12 октября 2009

Проблема заключалась в том, что компилятор отказывался заглядывать в реальный класс ... но это было бы с ошибочным путем: org.junit.Assert.assertArrayEquals (....

Скорее досадно, я могу добавить.

...