1

我在测试 Servlet 时遇到问题。Bouncer 是一个 Servlet,它具有简单的方法 doPost 和 init 被我覆盖。但是当我运行该代码时,我得到了异常

@Before
        public void Before() throws IOException, ServletException,
                InstantiationException, IllegalAccessException,
                IllegalArgumentException, InvocationTargetException,
                NoSuchMethodException, SecurityException, ClassNotFoundException {
            encoder = EasyMock.createMock(Encoder.class);
            EasyMock.expect(encoder.encode("password")).andReturn("asdf");
            EasyMock.expect(encoder.encode("nic")).andReturn("asss");
            EasyMock.expect(encoder.encode("Password")).andReturn("ass");
            EasyMock.replay(encoder);
            db = EasyMock.createMock(UserDataBase.class);
            db.connect();
            EasyMock.expect(db.isConnected()).andReturn(true);
            EasyMock.expect(db.getUserByLoginAndPassword("login", "asss"))
                    .andReturn(null);
            EasyMock.expect(db.getUserByLoginAndPassword("login", "asdf"))
                    .andReturn(new User("Rafal", "Machnik"));
            EasyMock.expect(db.getUserByLoginAndPassword("fake", "asdf"))
                    .andReturn(null);
            EasyMock.expect(db.getUserByLoginAndPassword("login", "ass"))
                    .andReturn(null);
            EasyMock.replay(db);

            lsf = EasyMock.createMock(LoginServiceFactory.class);
            EasyMock.expect(lsf.getEncoder()).andReturn(encoder).anyTimes();
            EasyMock.expect(lsf.getUserDataBase()).andReturn(db).anyTimes();
            EasyMock.replay(lsf);

            config = EasyMock.createMock(ServletConfig.class);
            EasyMock.expect(config.getInitParameter("LoginServiceFactory"))
                    .andReturn("pl.to.cw4.LoginServiceFactory");
            EasyMock.replay(config);

            request = EasyMock.createMock(HttpServletRequest.class);
            EasyMock.expect(request.getParameter("login")).andReturn("login")
                    .anyTimes();
            EasyMock.expect(request.getParameter("password")).andReturn("password")
                    .anyTimes();
            EasyMock.replay(request);

            pageSource = new StringWriter();

            response = EasyMock.createMock(HttpServletResponse.class);
            EasyMock.expect(response.getWriter())
                    .andReturn(new PrintWriter(pageSource)).anyTimes();
            EasyMock.replay(response);

            bouncer = new Bouncer(lsf);

            bouncer.init(config);

        }

        @Test
        public void bouncerTest() throws ServletException, IOException {
            bouncer.service(request, response);
            assertNotNull(pageSource.toString());

        }

java.lang.AssertionError:意外的方法调用getMethod():在org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:32)...

如果有人知道如何解决它,我将不胜感激。

4

2 回答 2

1

service()方法调用getMethod()请求以确定它是否必须调用doGet()doPost()其他 servlet 方法。由于你没有getMethod()在你的模拟请求中存根这个调用,EasyMock 会抛出这个异常。

你为什么不doPost()直接打电话,而不是打电话service(),因为那是你要测试的方法?

于 2013-03-23T22:08:22.640 回答
1

该错误表明 easymock 在模拟对象中遇到了方法调用 getMethod()。逐行调试程序并为模拟对象添加期望调用。

如果方法调用不是模拟对象,则不必在期望中添加方法调用,但应将模拟对象中的所有调用添加到您的测试方法中。

getMethod() 在服务中被调用,因为你在模拟 HttpServletRequest ,你还需要模拟在 HttpServletRequest 上调用的所有方法

于 2013-03-23T22:08:49.003 回答