2

2 つの文字列を比較/アサートする簡単なテスト ケースを (jobs-ejb 環境で) 実行しました。
残念ながら、文字列は互いに一致していません (バグがあります)。

しかし、問題は、Eclipseからテスト ケースを実行すると、結果が失敗としてログに記録されることです。これは、予想されるオブジェクトと実際のオブジェクトが一致しないためです。 ant
から同じテスト ケースを実行すると、結果はerrorとしてログに記録されます。 これは本当に奇妙で驚くべきことであり、さらに付け加えると、この動作はjunit 4 バージョンでのみ認識されます。junit 3.8 でテスト ケースを実行すると、ant と eclipse の両方が結果を失敗として記録します。

何がうまくいかないのかについての提案や指針はありますか?
前もって感謝します :)

Ant バージョン: 1.6.1 Junit バージョン: 4.10

4

2 に答える 2

1

質問に記載されているテスト結果の動作の違いは、ant バージョンの問題によるものです。下位バージョンの ant では、このようなタイプの動作が発生します (下位バージョンの ant では、ComparisonFailureが失敗ではなくエラーと見なされるためである可能性があります)。この動作は、ant バージョン 1.7.1 (およびそれ以前) で見つかりました。しかし、この問題は最新のant jar 1.8.4で解決されています。上記のテスト ケースを最新の ant バージョンで実行したところ、結果はエラーはなくエラーとして記録されました。そのため、このような問題が発生した場合は、ant jar を 1.8.4またはその他の利用可能な最新バージョンに更新してください。

于 2012-09-24T14:46:54.580 に答える
1

わかりました、さらに掘り下げたところ、これは特定のアプリケーション サーバーに関連していないことがわかりました。任意のアプリ サーバーで再現できます。
以下に示すように、サンプル (junit4) テスト ケースを作成するだけです。

@Test
public void stringTest() {
    org.junit.Assert.assertEquals("Comparing 2 string:", "abc", "xyz");
}

次に、Eclipse から実行します。結果は 1 回の失敗として表示されます。Ant(またはMaven)ターゲットを使用して、アプリサーバー経由で同じことを実行すると、結果がエラーとして返されます。

ログを調べた後、これは junit4 org.junit.Assert.assertEquals(String message, Object expected,Object actual) メソッドがAssertionErrorの代わりにComparisonFailureをスローするためだと思います。これに関する私の分析は、junit4 assert() メソッド (org.junit.Assert.assertEquals(String, Object, Object)) が String インスタンスに対してのみ ComparisonFailure をスローすることです。以下は、org.junit.Assert.assertEquals ( junit4 assert メソッド)のコードです。

static public void assertEquals(String message, Object expected, Object actual) {
    if (expected == null && actual == null)
        return;
    if (expected != null && isEquals(expected, actual))
        return;
    else if (expected instanceof String && actual instanceof String) {
        String cleanMessage= message == null ? "" : message;
        throw new ComparisonFailure(cleanMessage, (String) expected,
                (String) actual);
    } else
        failNotEquals(message, expected, actual);
}

そして、これは junit.framework.Assert.assertEquals(String, Object, Object) (つまり、junit3 assert メソッド)のコードです。

static public void assertEquals(String message, Object expected, Object actual) {
    if (expected == null && actual == null)
        return;
    if (expected != null && expected.equals(actual))
        return;
    failNotEquals(message, expected, actual);
}

junit4 assertEquals() では、2 つの等しくない文字列に対してComparisonFailureをスローする、等しくない String インスタンスに対して追加のチェックが追加されていることがわかります。他のすべての等しくないオブジェクト、つまり Integer、Long など。呼び出しは、 AssertionErrorをスローするfailNotEquals()メソッドに行きます。

junit4 の org.junit.Assert.assertEquals() メソッドに String インスタンス チェックを追加することの設計上の重要性を理解するのを手伝ってくれる人はいますか。なぜ本当に追加され、なぜ文字列のみに追加されるのですか?

于 2012-09-21T08:43:19.297 に答える