9

Restriction-objectを提供する特定のメソッドがあります(Restrictionはインターフェイスです)。そして、その実装は既に testet であるため、メソッドが実際にオブジェクトを配信するかどうかをテストしたいだけですRestrictionImpl
一緒に使用できるマッチャーがあることを知り、このタスクには -マッチャーが必要だと思いましたassertThatisA

私のコードを簡略化すると、次のようになります。

public static Restriction getRestriction() {
    return new RestrictionImpl();
}

私のテストはそのように見えます。

@Test
public void getRestriction_returnsRestrictionImpl() {
    assertThat(getRestriction(), isA(RestrictionImpl.class));
}

ただし、これはコンパイルされません。私ができることは、 aRestrictionImplが a Restriction... であるかどうかをテストすることだけですが、これを行う意味はありません。

の目的を誤解していisAますか? そして、それは実際には何を意味するのでしょうか?

更新:
を使用するとうまくいきますが、それはまさにそのための近道assertThat(getRestriction(), is(instanceOf(RestrictionImpl.class)))だと思いました。 私が望む方法で呼び出すには、署名が必要ですが、その署名はisA
assertThatassertThat(T, Matcher<? extends T>)assertThat(T, Matcher<? super T>)

4

2 に答える 2

11

私の問題を説明する問題を見つけました:
https://github.com/hamcrest/JavaHamcrest/issues/27

そしてisA、このバージョンのjunitでは単に署名が間違っているようです。のショートカットであることを意図していますis(isIntanceOf(...))が、そうではありません。

于 2016-08-17T04:37:06.473 に答える
2

おそらく、 instanceOfを使用したいでしょう。そしてご存知のように、これらはすべて公開されている javadoc を持っています。Where isA ... はまさにあなたが必要としているものです。問題は、プロジェクトのセットアップに必要な hamcrest コア マッチャー ライブラリがあるかどうかです。言い換えれば、多分あなたはこれをここで読むべきです。

そして、私自身のプロジェクトの1つからのいくつかのサンプルコード:

import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
...
@Test
public void testWhatever() throws IOException, ApiException {
    try { ...
        fail("should have thrown");
    } catch (IllegalStateException e) {
        e.printStackTrace(); // as expected
        assertThat(e.getCause(), is(instanceOf(SomeClass.class)));

それで、あなたはそこにそれらの輸入品を持っていますか?これらのインポートをサポートするために、プロジェクトのセットアップにライブラリがありますか?

于 2016-08-16T18:31:45.837 に答える