Frage

Mein Setup:

  Netbeans 6.7
  Java6
  JUnit 4.5 added as the Test libraries

Wenn ich versuche, zwei Klassenarrays zu übergeben (als Objekt [] gegossen []), erhalte ich den Fehler "Symbol nicht finden" und mein Testfall wird nicht kompiliert.

Ich habe kein Problem mit den anderen Assert -Aussagen und wie gesagt, ich verwende die Junit 4.5 -Bibliotheken.

Hat jemand eine Ahnung, wie man dies behebt, oder beobachtet dieses skurrile Verhalten?

Netbeans ist in der Lage, diese Funktionserklärung durch ihre Autocomplete zu finden, kann jedoch nicht herausfinden, wo sie sich befindet, oder kann zu den Quellen navigieren.

Beispielcode:

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

Lösung

Nun, Assert.assertArayequals ist eine statische Methode, wie Sie aus Ihrem Code sehen können, der funktioniert:

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

Aber in dem Code, den Sie gegeben haben, haben Sie versucht, ihn als Instanzmethode zu verwenden:

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

Das würde nur dann funktionieren, wenn Sie statisch importiert würden Assert.* oder Assert.assertArrayEquals.

Wenn Ihre anderen Behauptungen jetzt funktionieren, meine, meine erraten ist, dass Sie immer noch abgeleitet sind TestCase (dh die "alte" Art des Schreibens von Junit -Tests) und dass Ihre Behauptungen anrufen TestCase.assertEquals usw.

Wenn Sie aber einen kurzen geben könnten, aber Komplett Beispiel eines Unit -Tests, bei dem eine Behauptung jedoch funktioniert, aber assertArrayEquals Nicht, wir könnten wahrscheinlich herausfinden, was los ist.

Andere Tipps

Sie müssen die Behauptung nicht vollständig qualifizieren oder Ihre Arrays auf Objekt -Arrays gießen. Importieren Sie einfach die richtigen Teile von JUnit und geben Sie Ihre Arrays direkt ein. Sie sollten jedoch die Parameterreihenfolge aus Ihrem Beispiel umkehren - was Sie erwarten, kommt zuerst ("Erwartungen"), was Sie tatsächlich aus dem Test erhalten ("Recalls"). Das funktioniert gut:

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 {}
}

Das Problem war, dass der Compiler sich weigerte, die eigentliche Klasse zu untersuchen. Aber mit einem Abosulteweg: org.junit.assert.assertArayequals (....

Ziemlich nervig kann ich hinzufügen.

Ich mag Singleshots Antwort, außer dass seine beiden Arrays tatsächlich die gleichen Objekte enthalten. Was ist, wenn die Objekte nicht die gleichen tatsächlichen Objekte sind (verschiedene Objekte gleiche Werte, aber gleich).

Also dachte ich, ich würde seine Antwort verbessern, um zu zeigen, wie das geht.

@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;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top