3

我有一些课(比如,Entity)。

我希望能够

  1. 测试一个实例是否“有效”,使用一些自定义代码来决定
  2. 还测试一个实例是否无效,最好使用相同的代码。

使用 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,而是做一些不同的事情?

4

3 回答 3

4

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

然后,您可以以您想要的方式否定它而不会产生任何后果。

于 2013-05-21T10:21:22.277 回答
3

您不应该assertmatchesSafely. 你应该只做布尔逻辑来返回真或假。调用代码有责任抛出断言错误和/或包装在 not。因此你应该做这样的事情:

public boolean matchesSafely(...){
       boolean result = true;
       result &= value1 == value2;
       result &= entity.getVal2() == someOtherVal2;
       return result;
}
于 2013-05-21T10:52:09.803 回答
0

虽然其他答案更正确,但另一种方法可能是在匹配器中捕获您的异常,然后在吞下异常时返回 false,否则返回 true。

这并不理想。

于 2016-03-04T17:11:53.760 回答