java - mockito 不匹配任何(类型)方法

标签 java unit-testing testing mockito hamcrest

我测试这段代码:

        PublisherCallbackWithLog publisherCallback = new PublisherCallbackWithLog<String>();

        for (SdkRequest.SdkRequest sdkRequest : SdkRequestsList.getRequestList()) {
            final String s = TextFormat.printToUnicodeString(sdkRequest);
            customPublisher.publish(s, publisherCallback);
        }

在我的测试中我有这一行:

    verify(customPublisher, times(1)).publish(argThat(eqWithoutRequestId(sdkRequest)), any(PublisherCallbackWithLog.class));

但是我得到一个错误,似乎是关于第二个参数。

Argument(s) are different! Wanted:
customPublisher.publish(
    ,
    <any>
);
-> at com.w.sdkService.servlets.SdkPollerServlet_PublishTest.readFromSpreadsheet3Rows_shouldPublish2Times(SdkPollerServlet_PublishTest.java:75)
Actual invocation has different arguments:
customPublisher.publish(
    "partner {
  display_name: "WTest"
  android_pkg_name: "com.example.eliran.myapplication"
  sharing_mode: DATA
}
requestId: "3a7458b6-edc0-4d4e-b52e-d2a3847bef0b"
requestType: REMOVE
",
    com.w.sdkService.services.callback.PublisherCallbackWithLog@56f6d40b
);
-> at com.w.sdkService.servlets.SdkPollerServlet.publishAddPartnersRequests(SdkPollerServlet.java:101)

Comparison Failure:  <Click to see difference>

Argument(s) are different! Wanted:
customPublisher.publish(
    ,
    <any>
);
-> at com.w.sdkService.servlets.SdkPollerServlet_PublishTest.readFromSpreadsheet3Rows_shouldPublish2Times(SdkPollerServlet_PublishTest.java:75)
Actual invocation has different arguments:
customPublisher.publish(
    "partner {
  display_name: "WTest"
  android_pkg_name: "com.example.eliran.myapplication"
  sharing_mode: DATA
}
requestId: "3a7458b6-edc0-4d4e-b52e-d2a3847bef0b"
requestType: REMOVE
",
    com.w.sdkService.services.callback.PublisherCallbackWithLog@56f6d40b
);
-> at com.w.sdkService.servlets.SdkPollerServlet.publishAddPartnersRequests(SdkPollerServlet.java:101)

否则我应该如何验证调用?

虽然调试它永远不会到达我的 matchesSafely 方法:

public class RequestMatcher extends TypeSafeMatcher<WazeSdkRequest.SdkRequest> {
    private WazeSdkRequest.SdkRequest expectedRequest;

    private RequestMatcher(final SdkRequest.SdkRequest request) {
        this.expectedRequest = request;
    }

    @Override
    protected boolean matchesSafely(final SdkRequest.SdkRequest sentRequest) {
        boolean answer = SdkRequest.newBuilder(sentRequest).clearRequestId().build()
                .equals(SdkRequest.newBuilder(expectedRequest).clearRequestId().build());

        return answer;
    }


    public static RequestMatcher eqWithoutRequestId(final SdkRequest request) {
        return new RequestMatcher(request);
    }

    @Override
    public void describeTo(final Description description) {

    }

最佳答案

我相信这是因为您在 RequestMatcher 上的通用类型是 WazeSdkRequest.SdkRequest,而您调用的方法 (customPublisher.publish()) 需要一个字符串。

如果您查看 TypeSafeMatcher.java 中的代码,您会发现它首先进行类型检查以查看是否应该继续执行 matchesSafely 方法:

    public final boolean matches(Object item) {
        return item != null
            && expectedType.isInstance(item)
            && matchesSafely((T) item);
    }

在这种情况下,我希望 expectedType.isInstance(item) 返回 false,这会导致您的测试失败。

此外,如果您实际实现了 describeTo 并覆盖了 describerMismatchSafely,您可能能够更好地调试它。

关于java - mockito 不匹配任何(类型)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45399045/

相关文章:

java - 使用java在json文件中添加键值

unit-testing - 将可区分的联合传递给 InlineData 属性

java - 我正在尝试将 junit 与 apt 插件一起使用

typescript - Jest模拟类的类实例和类中的函数

php - 在 Symfony 中向测试客户端添加新路由

python - 在简单的 DRF API 中测试什么?

java - 为什么Java字符串有拷贝构造函数?

java - 如何使用 Lucene、Highlighter 和 StandardAnalyzer 通过 Hibernate 搜索引擎获取文本片段

java - 数据库连接在两个应用程序之间共享的对象的整个生命周期内打开

javascript - 失败的 Jest 单元测试