21

List<Achievement>type のメンバーが含まれていると断言したいと思いTestAchievementます。

ここに私の主張があります:

List<Achievement> achievements; // Populated elsewhere
assertThat(achievements,hasItem(isA(TestAchievement.class)));

これはコンパイルされず、エラーが報告されます:

Assert 型のメソッド assertThat(T, Matcher) は、引数 (List, Matcher<Iterable<TestAchievement>>) には適用されません。

Hamcrest を使用したこのタイプのアサーションの正しい構文は何ですか?

4

7 に答える 7

22

すべての助けをありがとう。

ここの投稿は、それが Hamcrest の欠陥であることを示唆していたので、バグを登録するために hacmrest サイトに向かいました。ハムクレスト。

このバグは 1.1 に存在します。

<dependency org="org.hamcrest" name="hamcrest-all" rev="1.1">

ただし、正しい依存宣言は次のとおりです。

<dependency org="org.hamcrest" name="hamcrest-library" rev="1.3.RC2"/>

これに更新すると、問題が解決しました。私のテストで使用される構文は次のとおりです。

 assertThat(achievements, hasItem(isA(TestAchievement.class)));
于 2011-02-13T03:19:02.793 に答える
9

これに関連する Java 6のバグがあります。

このコードは、「シンボルが見つかりません...」などのさまざまなエラーをスローします。

assertThat(achievements, hasItem(isA(TestAchievement.class)));

これを回避するには、マッチャーを変数として宣言し、その変数を参照します。これが機能するためには、変数の型、特にジェネリック セクションが非常に重要であることに注意することが重要です。

Matcher<Iterable<? super TestAchievement>> matcher = hasItem(isA(TestAchievement.class));
assertThat(achievements, matcher);

興味深いことに、instanceOf()代わりに使用するとisA()、もう一度問題が発生します。(ただし、警告を無視しても、これでうまくいく可能性があります。) 以前の修正を拡張すると、次のように使用できます。

Matcher<TestAchievement> itemMatcher = Matchers.instanceOf(TestAchievement.class);
Matcher<Iterable<? super TestAchievement>> matcher = hasItem(itemMatcher);
assertThat(achievements, matcher);
于 2013-12-23T21:30:58.330 に答える
3

私はしばらくこれと戦ってきましたが、ここでのアプローチのどれも実際に期待される結果をもたらしませんでした。純粋な絶望から、配列に変換して、それが違いを生むかどうかを確認してみました:

List<Object> listOfThings = (List) someService.findThings(); // your business logic here
Object[] arrayOfThings  = listOfThings.toArray(new Object[listOfThings.size()]);

assertThat(arrayOfThings, hasItemInArray(instanceOf(SpecialThing.class)));

そして、それは違いをもたらしました。今、私のテストは問題なく動作します。copy-to-array の 1 行は、多くの手間を省くための合理的なトレードオフのようです。

于 2012-12-14T06:11:48.780 に答える
3
assertThat(achievements, hasItem(
    IsInstanceOf.<Achievement>instanceOf(TestAchievement.class)));
于 2011-02-13T02:53:01.653 に答える
2

実際には、最新のリリースを使用しても、もう少し複雑なMatcherでは機能しません。

assertThat(result.getAnswers(),
            Matchers.hasItem(Matchers.hasProperty("content")));

それは機能しません。次のようになります。

Assert 型のメソッド assertThat(T, Matcher) は、引数 (Set, Matcher>) には適用されません。

配列に変換することで解決できます:

assertThat(result.getAnswers().toArray(), hasItemInArray(Matchers.hasProperty("content", equalTo("<h4>new comment</h4>"))));
于 2013-04-15T00:11:25.987 に答える
2

私はしばらくこれをいじっていましたが、私が知っている唯一の方法はに変換するList<Achievement>ことのようList<Object>です。問題はCoreMatchers.instanceOf()返品Matcher<Object>です。

その変更により、これを機能させることができます:-

List<Object> achievements = new ArrayList<Object>();
achievements.add(new Achievement());
achievements.add(new TestAchievement());
assertThat(achievements, hasItem(instanceOf(TestAchievement.class)));
于 2011-02-13T02:40:16.297 に答える
2

http://code.google.com/p/hamcrest/source/browse/trunk/hamcrest-java/hamcrest-core/src/main/java/org/hamcrest/MatcherAssert.javaから署名は

assertThat(T actual, Matcher<? super T> matcher)

したがって、問題は、マッチャーが でMatcher<TestAchievement>あり、スーパークラスのインスタンスまたはアチーブメントのインターフェースに対して機能するマッチャーではないことです。

instanceOfマッチャーにはバグのある型がバインドされているようです。次のようなことを行うことで、そのバグを回避できます

@SuppressWarnings("unchecked")
Matcher/*no_param*/ isATestAchievement = instanceOf(TestAchievement.class);
assertThat(..., isATestAchievement);
于 2011-02-13T02:46:21.480 に答える