我有一些课(例如Entity)。

我希望能够


使用一些自定义代码来确定该实例是否为“有效”
还可以测试实例无效,最好使用相同的代码。


使用maven,surefire,JUnit 4.11(及其附带的hamcrest东西)。

所以我写这样的课

class IsValidEntity extends TypeSafeMatcher<Entity>{

    @Override public boolean matchesSafely(Entity e){
       // and here I do a bunch of asserts...
       assertNotNull(e.id);
       // etc.
    }

    @Override
    public void describeTo(Description description) {
       description.appendText("is valid entity");
    }

    @Factory
    public static <T> Matcher<Entity> validEntity() {
        return new IsValidEntity();
    }
}


好吧,我可以

assertThat(entity, is(validEntity());


在JUnit测试中,桃花心木。

但是我做不到

assertThat(entity, not(validEntity());


因为validEntity失败并带有断言,而不是,我想它应该只是return false

显然,我在这里做着倒退,但是我不确定做这些自定义匹配器最聪明的方法是什么。或者,也许我根本不应该使用TypeSafeMatcher而不是做其他事情?

最佳答案

您的matchesSafely方法应该被重写,以避免引发断言失败。相反,只需手动执行检查,然后在必要时返回false

然后,您可以按自己想要的方式取消它,而不会产生任何后果。

09-11 09:28