如何使用isA-Matcher

How to use the isA-Matcher

我有一个特定的方法可以传递一个 Restriction-object(其中 Restriction 是一个接口)。由于它的实现已经过测试,我只想测试我的方法是否真的传递了一个 RestrictionImpl-object。
我看到有可以与 assertThat 一起使用的匹配器,我认为 isA-匹配器是完成此任务所需的东西。

简化后的代码如下所示:

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

我的测试看起来像那样;

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

然而,这不会编译。我所能做的就是测试,如果 RestrictionImplRestriction... 但是这样做没有意义。

我是不是误解了isA的目的?它实际上意味着什么?

更新:
使用 assertThat(getRestriction(), is(instanceOf(RestrictionImpl.class))) 会起作用,但我认为 isA 是一个捷径。
以我想要的方式调用 assertThat 需要它具有签名 assertThat(T, Matcher<? extends T>),但它的签名是 assertThat(T, Matcher<? super T>)

您可能想使用 instanceOf. And you know, those things all have javadoc available in the open. Where isA ... should be exactly what you need. So the problem might be: do you have the required hamcrest core matchers library in your project setup? In other words: maybe you should read this here

还有一些示例代码,来自我自己的一个项目:

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)));

那么,你们那里有那些进口商品吗? 您的项目设置中是否有支持这些导入的库?

我发现了一个描述我的问题的问题:
https://github.com/hamcrest/JavaHamcrest/issues/27

看起来 isA 只是在这个版本的 junit 中有错误的签名。它本来是 is(isIntanceOf(...)) 的快捷方式,但它不是。