- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我得到了这个 org.mockito.exceptions.misusing.UnfinishedStubbingException
但根据我在互联网上可以找到的所有帖子和描述,它似乎没有意义。
异常方法声明 thenReturn
可能丢失,但事实并非如此。我在下面的示例代码中故意保留了两种方式:doReturn
和 thenReturn
。他们都没有工作。两者都具有完全相同的异常消息。
此外,没有内联模拟。我准备了所有静态类并正在使用 PowerMockitoRunner。
我找不到任何出路。谁能帮我看看是怎么回事?
编辑:我忘了说我使用的是 Mockito 1.8.5 和 PowerMockito 1.4.10。
完全异常:
org.mockito.exceptions.misusing.UnfinishedStubbingException:
Unfinished stubbing detected here:
-> at org.powermock.api.mockito.internal.PowerMockitoCore.doAnswer(PowerMockitoCore.java:31)
E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
when(mock.isOk()).thenThrow(exception);
doThrow(exception).when(mock).someVoidMethod();
Hints:
1. missing thenReturn()
2. although stubbed methods may return mocks, you cannot inline mock creation (mock()) call inside a thenReturn method (see issue 53)
at br.com.tests.email.EnvioCompartilhamento.mockCaptcha(EnvioCompartilhamento.java:120)
at br.com.tests.email.EnvioCompartilhamento.setup(EnvioCompartilhamento.java:60)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at org.junit.internal.runners.MethodRoadie.runBefores(MethodRoadie.java:132)
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:95)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:102)
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
我的测试课。代码行增加 10 乘 10(或类似):
006 --> import br.com.common.MyProperties;
import br.com.struts.email.EnvioDeEmail;
import br.com.struts.email.forms.FormularioParaCompartilhamento;
import br.com.util.UrlUtil;
010 --> import br.com.popular.commons.Publications;
import br.com.popular.commons.utils.escenic.RetrievingObjects;
import com.captcha.Captcha;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
020 --> import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import static org.junit.Assert.assertNull;
030 --> import static org.junit.Assert.fail;
import static org.mockito.Matchers.*;
import static org.powermock.api.mockito.PowerMockito.*;
040 --> @RunWith(PowerMockRunner.class)
@PrepareForTest({ Captcha.class, RetrievingObjects.class, UrlUtil.class })
public class EnvioCompartilhamento {
@Mock
private ActionMapping mapping;
@Mock
private HttpServletRequest request;
050 --> @Mock
private HttpServletResponse response;
private FormularioParaCompartilhamento formulario;
@Before
public void setup() throws NoSuchMethodException, NoSuchFieldException, IOException {
mockStaticClasses();
mockRequestBehavior();
060 --> mockCaptcha();
mockResponse();
formulario = new FormularioParaCompartilhamento();
}
@Test
public void compartilhamentoComSucesso() {
formulario.setEmailTo("teste@teste.com");
formulario.setIdArtigo("12345");
070 --> formulario.setIsArtigo(true);
formulario.setMessage("Corpo do email");
formulario.setTitulo("Titulo");
formulario.setUrl("http://www.google.com");
formulario.setCaptcha("ABCD");
EnvioDeEmail email = new EnvioDeEmail();
final ActionForward resultado = email.compartilhamento(mapping, formulario, request, response);
assertNull(resultado);
080 --> }
112 --> private void mockRequestBehavior() {
when(request.getMethod()).thenReturn("POST");
when(request.getHeader("X-FORWARDED-FOR")).thenReturn("User IP");
}
private void mockCaptcha() {
120 --> HttpSession session = mock(HttpSession.class);
doReturn(session).when(request).getSession();
Captcha captcha = Mockito.mock(Captcha.class);
doReturn(captcha).when(session).getAttribute("captcha");
doReturn(true).when(captcha).isInputValid(anyString());
}
private void mockStaticClasses() {
final MyProperties myProperties = mock(MyProperties.class);
130 --> mockStatic(RetrievingObjects.class);
when(RetrievingObjects.componentFromPublicationAtSystemScope(any(Publications.class), eq("EmailProperties"), eq(MyProperties.class))).
thenReturn(myProperties);
mockStatic(UrlUtil.class);
doNothing().when(UrlUtil.class);
}
private void mockResponse() throws IOException {
PrintWriter writer = mock(PrintWriter.class);
140 --> doReturn(writer).when(response).getWriter();
}
}
最佳答案
doNothing().when(UrlUtil.class);
这对 Mockito 或 PowerMock 没有任何意义;您需要指定要模拟的特定调用。这使得这个 stub 未完成。查看PowerMockito when
docs举个例子。
但是,Mockito 无法在这一行上告诉您您的 stub 未完成——它只能在您与之交互时引发错误,因此它只会在稍后检测到错误情况,在您的 mockCaptcha
方法。
要解决此问题,请按如下方式完成您的 UrlUtil stub (我指定 PowerMockito 以区别于 Mockito.doNothing,尽管看起来您的静态导入是正确的):
PowerMockito.doNothing().when(UrlUtil.class);
UrlUtil.methodYouWantToMock();
或者,要使 UrlUtil 默认抑制其所有行为,请删除 doNothing
行和 put a default answer into your mockStatic
call :
mockStatic(UrlUtil.class, RETURNS_SMART_NULLS);
关于java - 模拟/PowerMockito : Weird Stubbing Exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33441494/
我只想模拟类中的一个静态方法,所有其他方法都应该像真实对象一样工作。 代码: public class ArrTest { public static int myMethod (int ar
我在使用 PowerMockito 模拟 whenNew(File.class) 时遇到问题。这是我要测试的方法: public void foo() { File tmpFile = new
我正在尝试模拟静态方法 Thread.sleep(1);在调用时返回 InterruptedException。我发现了一个似乎解决了我的问题的 SO 问题,但是在将我的代码设置为与该问题的答案相同后
我似乎无法克服这个问题。我正在尝试模拟一个带有 1 个参数的重载方法 class ClassWithOverloadedMethod { private boolean isValid(Cla
考虑以下(简化的)枚举: MyEnum { ONE public int myMethod() { // Some complex stuff return 1
当我尝试使用字符串输入模拟静态方法时,当我给出特定字符串时,模拟 stub 就会被执行,但是当我使用anyString()时,它不会按预期工作。 public class Foo { publ
我在一些单元测试中使用 PowerMockito,但遇到了问题。我正在尝试测试一种创建一系列线程并运行它们的方法。在每个线程内,创建一个我需要期望的对象,并返回我自己的模拟对象(它发出 http 请求
我有以下类,在构造函数中,我调用另一个构造函数来构建该类的字段: public class ClassIWantToTest { private ClassIWantToMock anothe
您好,我有这个 PowerMockito 测试,它会抛出 UnfinishedStubbingException @RunWith(PowerMockRunner.class) @PrepareFor
我有一些静态方法可以使用 Mockito + PowerMock 进行模拟。一切都是正确的,直到我尝试模拟一个只抛出异常的静态方法(并且什么都不做)。 我的测试类是这样的: 顶部: @RunWith(
测试片段: void somefunction() { try { aMock.doSomething(); bMock.another(); } finally {
我正在尝试使用 PowerMockito 捕获输入中传递给模拟对象的参数,这是代码: //I create a mock object ClassMocked mock = PowerMockito.
要测试的类 public class Randomer { public int get() { return (int) Math.random() + 1; } }
我正在编写 JUnit 测试以验证静态方法 (MyClass.myMethod()) 从未在方法流中被调用。我试着做这样的事情: PowerMockito.verifyStatic(Mockito
我想检查是否使用一组特定的参数调用了特定的构造函数,并检查参数是否正确。 该类使用 java (...) 的任意参数,如下所示: public class MyClass{ public My
我正在测试一个运行直到AtomicBoolean值发生变化的任务类。我使用 PowerMockito 是因为 AtomicBoolean 实例的 get() 方法是 final方法。 MyTaskTe
我有以下 jar : javax.servlet-api-3.1.9.jar junit-4.10.jar mockito-all-1.10.19.jar mockito-core-1.10.19.j
在单元测试中,如何忽略对方法的调用,如下所示? void methodToBeTested(){ // do some stuff methodToBeSkipped(parame
我正在尝试测试一些严重依赖静态方法调用的遗留代码。 基本上,我有一个类 A,它有方法 b() 和 c()。 A.b() 返回 void,A.c() 返回一个值。 如果真正的 A.b() 被调用,被测类
我正在使用 PowerMockito 测试静态方法,但不幸的是得到了ClassCastException。注意完全确定我是否没有遵循语法规则。 待测试代码: List proxyPrefs = (Li
我是一名优秀的程序员,十分优秀!