9

我有某种方法可以提供Restriction-object(Restriction接口在哪里)。而且由于它的实现已经是 testet,我只想测试我的方法是否真的提供了一个RestrictionImpl-object。
我看到有可以一起使用的匹配器,assertThat我想,isA-matcher 是这个任务需要的东西。

简化我的代码如下所示:

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

我的测试看起来像这样;

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

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

我对目的有误解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 核心匹配器库?换句话说:也许你应该在这里阅读。

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

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 回答