如何使用isA-Matcher

时间:2016-08-16 18:29:05

标签: java junit junit4 matcher assertthat

我有一个提供Restriction - 对象的方法(其中Restriction是一个接口)。并且由于它的实现已经是testet,我只想测试我的方法是否实际上提供了RestrictionImpl - 对象。
我看到有一些匹配器可以和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>)

2 个答案:

答案 0 :(得分:8)

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

看起来isA在这个版本的junit中只有错误的签名。它意味着是is(isIntanceOf(...))的捷径,但事实并非如此。

答案 1 :(得分:2)

您可能希望使用instanceOf。而且你知道,那些东西都是公开的javadoc。 A ...应该正是您所需要的。所以问题可能是:你的项目设置中是否有必要的hamcrest核心匹配库?换句话说:也许你应该阅读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)));

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