java - 尝试测试 servlet 时出现 MockitoException
问题描述
我正在尝试测试我用 Mockito 创建的一个简单的登录 servlet。我一直在做一些研究,我觉得我写的东西应该可以工作,但是我得到了一个“org.mockito.exceptions.base.MockitoException”
这是我的测试课:
@RunWith(GwtMockitoTestRunner.class)
public class LoginServletTest {
@Test
public void testLogInServlet() throws Exception {
final HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
final HttpServletResponse response =
Mockito.mock(HttpServletResponse.class);
when(request.getParameter("username")).thenReturn("testuser");
when(request.getParameter("password")).thenReturn("testpass");
final StringWriter stringWriter = new StringWriter();
final PrintWriter writer = new PrintWriter(stringWriter);
when(response.getWriter()).thenReturn(writer);
new LogInServlet().doPost(request, response);
assertTrue(stringWriter.toString().contains("My expected string"));
}
我得到了这个例外:
org.mockito.exceptions.base.MockitoException:
ClassCastException occurred while creating the mockito proxy :
class to mock : 'javax.servlet.http.HttpServletRequest', loaded by classloader : 'sun.misc.Launcher$AppClassLoader@18b4aac2'
created class : '$javax.servlet.http.HttpServletRequest$$EnhancerByMockitoWithCGLIB$$d31fd980', loaded by classloader : 'org.mockito.internal.creation.util.SearchingClassLoader@fbd1f6'
proxy instance class : null
instance creation by : ObjenesisInstantiator
You might experience classloading issues, disabling the Objenesis cache *might* help (see MockitoConfiguration)
at com.mypackage.mywidget.mywidget.LoginServletTest.<init>(LoginServletTest.java:50)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:195)
at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:244)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:241)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at com.google.gwtmockito.GwtMockitoTestRunner.run(GwtMockitoTestRunner.java:373)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.ClassCastException: $javax.servlet.http.HttpServletRequest$$EnhancerByMockitoWithCGLIB$$d31fd980 cannot be cast to org.mockito.cglib.proxy.Factory
at org.mockito.internal.creation.cglib.ClassImposterizer.createProxy(ClassImposterizer.java:143)
at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:58)
at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:49)
at org.mockito.internal.creation.cglib.CglibMockMaker.createMock(CglibMockMaker.java:24)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:59)
at org.mockito.Mockito.mock(Mockito.java:1285)
at org.mockito.Mockito.mock(Mockito.java:1163)
... 24 more
导致此错误的行是:
final HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
我是 mockito 的新手,但从我收集的这个错误来看,mockito 在模拟 HttpServletRequest 时遇到了麻烦。我不确定为什么或我能做些什么来解决这个问题。任何帮助,将不胜感激。
解决方案
我试图复制你的问题。它似乎工作正常您可以尝试以下代码吗?
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class LoginServletTest {
class LogInServlet extends HttpServlet {
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("My expected string");
}
}
@Test
public void testLogInServlet() throws Exception {
final HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
final HttpServletResponse response = Mockito.mock(HttpServletResponse.class);
when(request.getParameter("username")).thenReturn("testuser");
when(request.getParameter("password")).thenReturn("testpass");
final StringWriter stringWriter = new StringWriter();
final PrintWriter writer = new PrintWriter(stringWriter);
when(response.getWriter()).thenReturn(writer);
new LogInServlet().doPost(request, response);
assertTrue(stringWriter.toString().contains("My expected string"));
}
}
如果您仍然有例外,请相应地更新您的帖子
推荐阅读
- python - 如何在 Python 中对 3D 数组应用克里金法?
- ruby-on-rails - 如果其他用户在同一浏览器上登录,用户点击忘记密码链接最终会登录到应用程序
- python - 在 Python 2-7 中打印 XML 元素的所有属性
- javascript - 为什么我对两个选择器的比较永远不起作用?
- node.js - 通过 webpack 提供的 bundle.js 不适用于 webpack-dev-middleware + HtmlWebpackPlugin
- angular - 将数据从服务传递到父组件,然后从父组件传递到子组件
- android - Firebase 无法写入数据库且没有错误
- php - Prestashop 1.7 注册 smarty 相关产品标签
- bash - 无效字符串:必须使用 Bash 转义从 U+0000 到 U+001F 的控制字符?
- c# - How to apply styles in word while inserting WordMl in VSTO?