java - 为什么我的 Mockito 模拟对象使用真实的实现

标签 java unit-testing apache mocking mockito

我在模拟 Apache Http 客户端时遇到了问题。以下尝试创建模拟:

DefaultHttpClient httpClient = Mockito.mock(DefaultHttpClient.class);

无法创建真正的模拟。上面的行无一异常(exception)地执行,但是当我尝试对某些行为进行 stub 时:

Mockito.when(httpClient.execute(Mockito.<HttpUriRequest>anyObject())).thenReturn(null);

我从 AbstractHttpClient 中的方法中得到异常:

Exception in thread "main" java.lang.IllegalArgumentException: Request must not be null.
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:572)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554)

为什么在 Mockito.when 中执行的调用传递给 AbstractHttpClient?

我找到了这个特定问题的解决方案:使用接口(interface) HttpClient 而不是尝试模拟具体的子类。在这种情况下,这是一个更好的解决方案,但我想知道这里发生了什么?为什么我不能用 Mockito 正确模拟这个具体类? DefaultHttpClient 有什么特别之处吗?是否存在 Mockito 无法模拟具体类的其他情况?

我在 OSX 上使用 Mockito 1.8.5、Apache httpclient 4.0.3、Apache http core 4.1、JDK 1.6.0

最佳答案

关于 AbstractHttpClient 的几种方法是最终的,因此不会被 mock 。 IMO,这种行为是不模拟具体类的第一个原因。

关于java - 为什么我的 Mockito 模拟对象使用真实的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4547852/

相关文章:

linux - 如何将 LAMP 中的文档根文件夹更改为安装位置 (Ubuntu)

java - DB2 使用 ALT_COLLATE UNICODE 在非 unicode 数据库上插入 UTF-8 字符

java - 有关即将推出的 fork-join 框架的资源

java - 使用枚举的序数是一种好习惯吗?

unit-testing - 在 grails 中元编程的正确方法,以便在单元测试中可用

Apache Jakarta (Tomcat) 连接器将流量转发到特定的 Tomcat

java - Execute CommandA A% of time, CommandB B% of time, CommandA C% of time ----- Command Z% time 使用随机数

c# - 无法使用 Microsoft.QualityTools.Testing.Fakes.Shims.ShimNotSupportedException 填充 WebException

c++ - 单元测试浮点信号处理库时的错误界限

c++ - Apache 标准输出流