我有一个提供Restriction
- 对象的方法(其中Restriction
是一个接口)。并且由于它的实现已经是testet,我只想测试我的方法是否实际上提供了RestrictionImpl
- 对象。
我看到有一些匹配器可以和assertThat
一起使用,我想,isA
- 匹配器是你想要完成这项任务的东西。
简化了我的代码:
public static Restriction getRestriction() {
return new RestrictionImpl();
}
我的测试看起来像那样;
@Test
public void getRestriction_returnsRestrictionImpl() {
assertThat(getRestriction(), isA(RestrictionImpl.class));
}
但是这不会编译。我所能做的只是测试,如果RestrictionImpl
是Restriction
......但是没有必要这样做。
我是否误解了isA
的目的?它的意义是什么?
更新:
使用assertThat(getRestriction(), is(instanceOf(RestrictionImpl.class)))
会有效,但我认为isA
就是这样的捷径
以我想要的方式调用assertThat
会要求它具有签名assertThat(T, Matcher<? extends T>)
,但其签名为assertThat(T, Matcher<? super T>)
答案 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)));
那么,你有那些进口吗? 您的项目设置中是否有库来支持这些导入?