首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试测试servlet时出现MockitoException

尝试测试servlet时出现MockitoException
EN

Stack Overflow用户
提问于 2018-08-16 02:42:41
回答 1查看 658关注 0票数 0

我正尝试在我用Mockito创建的servlet中测试一个简单的日志。我已经对它做了一些研究,我觉得我写的东西应该可以工作,但我正在得到一个"org.mockito.exceptions.base.MockitoException“

下面是我的测试类:

代码语言:javascript
复制
@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"));
 }

我得到了这个异常:

代码语言:javascript
复制
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

导致此错误的行是:

代码语言:javascript
复制
final HttpServletRequest request = Mockito.mock(HttpServletRequest.class);

我对mockito还不熟悉,但据我所知,这个错误意味着mockito在模仿HttpServletRequest时遇到了麻烦。我不确定为什么或者我能做些什么来解决这个问题。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2018-08-16 04:21:10

我试着复制你的问题。它看起来工作得很好,你能试试下面的代码吗?

代码语言:javascript
复制
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"));

    }
}

如果你仍然有例外,请相应地更新你的帖子

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51864598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档