- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我做了很多 Mockito spy ,只是在一个新项目中模仿我自己的工作示例。但这惨遭失败
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import static org.mockito.Mockito.*;
public class SpyTest {
HttpClient httpClient;
private HttpResponse httpResponse;
private StatusLine responseStatus;
private HttpEntity responseEntity;
@BeforeMethod
public void setupClient() throws Exception {
List spy = spy(new ArrayList());
doReturn(true).when(spy).addAll(any(Collection.class)); // this works!
DefaultHttpClient directClient = new DefaultHttpClient();
httpClient = spy(directClient);
httpResponse = mock(HttpResponse.class);
responseStatus = mock(StatusLine.class);
responseEntity = mock(HttpEntity.class);
doReturn(responseStatus).when(httpResponse).getStatusLine();
doReturn(responseEntity).when(httpResponse).getEntity();
doReturn(httpResponse).when(httpClient).execute(any(HttpPost.class)); // failing here
}
@Test
public void itShouldSetupTheSpy() throws Exception {
doReturn(200).when(responseStatus).getStatusCode();
doReturn("OK").when(responseStatus).getReasonPhrase();
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
OutputStream os = (OutputStream) invocation.getArguments()[0];
os.write("{\"id\": 100}".getBytes());
return null;
}
}).when(responseEntity).writeTo(any(OutputStream.class));
}
}
但是我得到了错误
java.lang.IllegalArgumentException: Request must not be null. at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:801) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784) at SpyTest.setupClient(SpyTest.java:37)
我相信我已经关注了the official advice !密切关注,就像我的其他 spy 一样。和 this answer !似乎不适用于我,因为我不使用 CGLIB,从 Maven 依赖树可以看出:
[INFO] +- org.codehaus.jackson:jackson-mapper-asl:jar:1.9.3:compile [INFO] | \- org.codehaus.jackson:jackson-core-asl:jar:1.9.3:compile [INFO] +- org.testng:testng:jar:6.8:test [INFO] | +- junit:junit:jar:4.10:test [INFO] | | \- org.hamcrest:hamcrest-core:jar:1.1:test [INFO] | +- org.beanshell:bsh:jar:2.0b4:test [INFO] | +- com.beust:jcommander:jar:1.27:test [INFO] | \- org.yaml:snakeyaml:jar:1.6:test [INFO] +- org.mockito:mockito-all:jar:1.9.5:test [INFO] +- com.newrelic:newrelic-api:jar:2.3.0:compile [INFO] +- org.apache.httpcomponents:httpclient:jar:4.2.5:compile [INFO] | +- org.apache.httpcomponents:httpcore:jar:4.2.4:compile [INFO] | +- commons-logging:commons-logging:jar:1.1.1:compile [INFO] | \- commons-codec:commons-codec:jar:1.6:compile [INFO] \- org.apache.commons:commons-lang3:jar:3.1:compile
看起来 HttpClient 及其子类有问题。
最佳答案
execute
是一个 final method , Mockito 不能模拟 final 方法(如 the section on spying 和 the FAQ 中所述)。
为什么?因为在正常情况下您不能覆盖 final方法,所以 Java 采取了一种快捷方式并将(对 final方法的)调用直接编译到实现而不是在 Java's equivalent of a virtual method table 中查找它们。 .这意味着 Mockito 永远不会参与 final方法调用,因此无法拦截行为,甚至无法接收 stub /验证调用。
你能切换到模拟和使用 a raw HttpClient反而?您可以模拟接口(interface)的任何方法,而不必担心可见性或 final方法问题。
关于java - Mockito doReturn/when 执行真正的方法(没有CGILIB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20528472/
我有以下测试用例: ClassPathResource resource = new ClassPathResource(...); doReturn(resource.getInputStream(
我无法让 Mockito 覆盖我正在测试的类中的方法。 @Test public void test_classToTest() throws Exception { DependencyA
好吧,我显然不太明白 doReturn(...).when(...) 和 when(...).thenReturn(...) 之间的区别。 问题是,当我上课时,我用 @Mock 注释模拟,并在我想测试
我有这个工作正常的代码。 public class MyClass implements Serializable { ... private UploadedFile uploadedFile;
我想运行一个方法,即使在@Before我设置了 doReturn(mockResult).when(spyObject).getResult(); 对于我的所有其他测试方法来说这样做是有意义的,但我现
如果我有一个对象 MyObject,我想在调用该对象的某些方法时返回一些值。例如这样的事情: doReturn(someValue).when(Mockito.any(MyObject.class))
这是我正在测试的类(class): public class A { public Integer callMethod(){ return someMethod(); } private Int
我正在尝试对以下方法进行单元测试: Class TestClass { public List test(String a, String b, String c, String d) thr
我做了很多 Mockito spy ,只是在一个新项目中模仿我自己的工作示例。但这惨遭失败 import org.apache.http.HttpEntity; import org.apache.h
当我尝试模拟方法时,收到 UnfinishedStubbingException 。我试图让 doReturn 返回实现特定接口(interface)的类的模拟实例。该接口(interface)是被模
我是 Mockito 新手。我知道 spy 对象永远不会调用 doReturn 的原始方法,但在我的代码中,这没有发生 import static org.junit.Assert.assertTru
我有一个单例类来帮助我从控制台读取输入: public class IOHelper { public org.slf4j.Logger logger = Logger.logger;
我正在尝试通过 doReturn 方法使用 Mockito 深度 stub 功能。 当我在深度 stub 示例中使用 when 方法时,它工作正常: Foo mock = mock(Foo.class
我正在为 SOAP API 编写单元测试,我需要在其中模拟某个方法的响应,但该方法一直被调用。 我的单元测试的(相关)代码如下: import org.mockito.Matchers; import
我有一个 junit 测试,其中我在类中模拟了一个对象。让我们用名为 mocker 的 MyManager 的 @Mock 调用类 Mocker。 示例类: public class Mocker {
当我不能使用 Mockito.when() 时,如何使用 PowerMockito 中的 doReturn 模式来模拟静态方法? 我想测试以下静态方法: public static PrintWrit
我正在测试一些遗留代码并尝试模拟父类(super class)中的某些行为。奇怪的是,mockito 不会触发并返回我期望的值,在某些情况下,它甚至在 doReturn 行上抛出 Nullpointe
我有一个方法调用,需要在第一次调用时返回 valueA,在第二次调用时返回 valueB。我正在使用 PowerMockito spy ,所以如果我只需要返回一个值,它看起来像这样: PowerMoc
我要测试的类: import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; imp
我是 PowerMockito 的新手,它显示的行为我不明白。以下代码解释了我的问题: public class ClassOfInterest { private Object methodIW
我是一名优秀的程序员,十分优秀!