2

私のセットアップ:

  Netbeans 6.7
  Java6
  JUnit 4.5 added as the Test libraries

2 つのクラス配列 (Object[] としてキャスト) を渡そうとすると、「シンボルが見つかりません」というエラーが表示され、テスト ケースがコンパイルされません。

他の assert ステートメントに問題はありません。前述のとおり、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などです。

1つのアサーションが機能するが機能しない単体テストの短いが完全な例を示すことができれば、おそらく何が起こっているのかを理解することができます。assertArrayEquals

于 2009-10-12T06:28:26.033 に答える
1

アサーションを完全に修飾したり、配列をオブジェクト配列にキャストしたりする必要はありません。JUnit の適切な部分をインポートして、配列を直接渡すだけです。ただし、例のパラメーターの順序を逆にする必要があります-期待するものが最初に来て(「期待」)、テストから実際に取得したものが2番目に来ます(「実際」)。これはうまくいきます:

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

彼の2つの配列に実際に同じオブジェクトが含まれていることを除けば、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 に答える
0

問題は、コンパイラが実際のクラスを調べることを拒否していたことでした..しかし、それは絶対パスであるでしょう: org.junit.Assert.assertArrayEquals(....

むしろ迷惑です。

于 2009-10-12T05:49:47.843 に答える