我该如何调用自定义的hamcrest匹配器?

时间:2016-06-14 16:59:12

标签: java junit hamcrest

我想检查使用realtimeUpdate调用模拟的时间currentTime字段等于某些LocalDateTime

我想使用自定义匹配器运行此类代码:

verify(mockServerApi).sendUpdate(new TimeMatcher().isTimeEqual(update, localDateTime2));

但是当我尝试使用此自定义匹配器运行时出现编译错误。

我该如何解决这个问题?

public class TimeMatcher {

    public Matcher<RealtimeUpdate> isTimeEqual(RealtimeUpdate realtimeUpdate, final LocalDateTime localDateTime) {
        return new BaseMatcher<RealtimeUpdate>() {
            @Override
            public boolean matches(final Object item) {
                final RealtimeUpdate realtimeUpdate = (RealtimeUpdate) item;
                return realtimeUpdate.currentTime.equalTo(localDateTime);
            }

这是方法签名

void sendRealTimeUpdate(RealtimeUpdate realtimeUpdate);

这是编译错误:

enter image description here

1 个答案:

答案 0 :(得分:1)

以下是您可以继续的方式

课程TimeMatcher,您只需要LocalDateTime

public class TimeMatcher {
    public static Matcher<RealtimeUpdate> isTimeEqual(final LocalDateTime localDateTime) {
        return new BaseMatcher<RealtimeUpdate>() {
            @Override
            public void describeTo(final Description description) {
                description.appendText("Date doesn't match with "+ localDateTime);
            }

            @Override
            public boolean matches(final Object item) {
                final RealtimeUpdate realtimeUpdate = (RealtimeUpdate) item;
                return realtimeUpdate.currentTime.isEqual(localDateTime);
            }
        };
    }
}

测试:

Mockito.verify(mockRoutingServerApi).sendRealTimeUpdate(
    new ThreadSafeMockingProgress().getArgumentMatcherStorage()
        .reportMatcher(TimeMatcher.isTimeEqual(localDateTime2))
        .returnFor(RealtimeUpdate.class));

您需要使用returnFor提供RealtimeUpdate预期的sendRealTimeUpdate参数类型

这相当于:

Mockito.verify(mockRoutingServerApi).sendRealTimeUpdate(
    Matchers.argThat(TimeMatcher.isTimeEqual(localDateTime2))
);