7

このコードをコンパイルしようとしています

import static org.hamcrest.Matchers.is;
import static org.hamcrest.number.OrderingComparison.lessThan;

...

Assert.assertThat(0, is(lessThan(1)));

次のコンパイル エラーが発生します。

assertThat(Object, org.hamcrest.Matcher<java.lang.Object>) には適用できません(int, org.hamcrest.Matcher<capture<? super java.lang.Integer>>)

これは、ハムクレストの異なるバージョン間の衝突でしょうか? jUnit 4.6 と hamcrest 1.3 を使用しています

4

4 に答える 4

5

問題は、Hamcrestの新しいバージョンの署名がJUnitと互換性がないため、JUnitに古いコピーのHamcrest(1.1)がバンドルされていることだと思います。2つの可能な解決策があります:

  1. クラスパスからHamcrest(1.3)のバージョンを削除し、JUnitにバンドルされているコピーを使用します。
  2. Hamcrestを含まない別のリリースバージョンのJUnit(jarの名前は'junit-dep-xxx.jarのようになっていると思います)を使用します。
  3. の呼び出しorg.junit.Assert.assertThat()をorg.hamcrest.MatcherAssert.assertThat()`に変更します。

後者はおそらく私の推奨オプションです。Hamcrestバージョンはより優れたassertThat()失敗メッセージを生成し、1.1より後のバージョンにはいくつかの優れた機能があります(例TypeSafeDiagnosingMatcher)。

于 2010-11-01T12:57:01.107 に答える
2

私は Hamcrest を使用していませんが、明らかにintオブジェクトではありません。Integer代わりに使用します。

Assert.assertThat(Integer.valueOf(0), is(lessThan(1)));

自動ボクシングが機能しないJavaバージョン<= 1.4を使用していると思います。したがって、first への明示的な変換が必要ですInteger

于 2009-11-30T17:49:22.847 に答える
1

おそらく問題はあなたのassertThatメソッドだと思います。それが言うなら、

void assertThat(Object item, Matcher<Object> matcher) { ... }

次に、次のように変更する必要があります。

void <T> assertThat(T item, Matcher<? super T> matcher) { ... }

たぶん、あなたのJUnitライブラリはあなたのHamcrestライブラリと比較して古くなっていますか?両方を自分で作成しましたか?クラスパスにJUnitまたはHamcrestの複数のコピーがある可能性がありますか?

于 2009-12-02T15:54:06.310 に答える
0

これは非常に奇妙な問題です。正しく機能するはずなので、もう少し情報が必要だと思います。JUnit 4.4 と Hamcrest 1.1 (少し古いですが、現在のプロジェクトで使用しているものなので、テストは簡単でした) を使用して再現しようとしましたが、完全に機能しました。

私が気付いた唯一の違いは、Eclipse がorg.hamcrest.Matchers.lessThanの代わりにインポートされたことですorg.hamcrest.number.OrderingComparisons.lessThanが、後者を使用した場合も問題なく動作しました。

古いバージョンの Hamcrest または JUnit を使用していることが原因である可能性があります (実際に使用しているバージョンはどれですか? まだ言及していません)。奇妙なのは、明示的なキャストを に追加した場合でもエラーが発生するという事実ですInteger。それは興味深いことであり、このエラーを投稿すると役立つ可能性があります...

とにかく、構文エラーなどがないため、完全に機能するはずです。そのため、セットアップが問題の原因である必要があります。

于 2009-12-02T10:11:08.263 に答える