Mockito TooManyActualInvocations

时间:2017-01-09 08:32:23

标签: java unit-testing junit mockito

我正在使用Junit和Mockito来测试前进。 以下是PortalServletTest类的一部分:

@SuppressWarnings("serial")
@BeforeClass
public static void setUpTests() {
    when(request.getRequestDispatcher(Mockito.anyString())).thenReturn(rd);
    when(request.getSession()).thenReturn(httpSession);
    when(httpSession.getServletContext()).thenReturn(servletContext);
    when(servletContext.getAttribute(Constants.CONFIGURATION_MANAGER_ATTR)).thenReturn(configurationManager);
    when(configurationManager.getConfiguration()).thenReturn(configuration);
    List<List<String>> mandatoryHeaders = new ArrayList<List<String>>();
    mandatoryHeaders.add(new ArrayList<String>() {
        {
            add("HTTP_XXXX");
            add("http-xxxx");
        }
    });

    List<List<String>> optionalHeaders = new ArrayList<List<String>>();
    optionalHeaders.add(new ArrayList<String>() {
        {
            add("HTTP_YYYY");
            add("http-yyyy");
        }
    });

    when(configuration.getIdentificationHeaderFields()).thenReturn(mandatoryHeaders);
    when(configuration.getOptionalHeaderFields()).thenReturn(optionalHeaders);

}

@Test
public void testMissingHeadersRequest() throws IOException {
    when(request.getHeader(Mockito.anyString())).thenReturn(null);
    target().path("/portal").request().get();
    Mockito.verify(response, times(1)).sendError(HttpServletResponse.SC_USE_PROXY, PortalServlet.MISSING_HEADERS_MSG);
}

@Test
public void testSuccesfulRequest() throws IOException, ServletException {
    Mockito.doAnswer(new Answer<Object>() {
        public Object answer(InvocationOnMock invocation) {
            Object[] args = invocation.getArguments();
            String headerName = (String) args[0];
            return headerName;
        }
    }).when(request).getHeader(Mockito.anyString());
    target().path("/portal").request().get();
    verify(rd).forward(Mockito.any(ServletRequest.class), Mockito.any(ServletResponse.class));
}

PortalServlet代码:

RequestDispatcher rd = request.getRequestDispatcher("index.html");
        rd.forward(mutableRequest, response);

问题是在测试类时,我收到错误消息:

  

requestDispatcher.forward(,);   通缉1次:    - &GT;在xxx.PortalServletTest.testSuccesfulRequest(PortalServletTest.java:140)

     

但是是2次。不受欢迎的调用:    - &GT;在xxx.PortalServlet.addRequestHeaders(PortalServlet.java:144)

     

at xxx.PortalServletTest.testSuccesfulRequest(PortalServletTest.java:140)

如果我单独运行每个测试,他们会通过OK。 看起来PortalServlet的前锋每次测试都会计算两次。 有任何建议如何解决这个问题?

提前致谢。

3 个答案:

答案 0 :(得分:2)

您正在使用@BeforeClass配置模拟对象。

在您的测试类中的@Tests执行之前,该方法被称为一次

您可以尝试将其更改为@Before!

换句话说:在进行任何测试之前,您需要配置模拟以允许一次调用。但是你正在进行多项测试。如果你假设你的模拟都以相同的方式使用,你只需为每个@Test方法重新配置每次

鉴于你的评论:这是

verify(rd, times(2)).forward ...

工作/帮助?

答案 1 :(得分:2)

除了@GhostCat写的内容之外,我认为在测试之前你应该reset所有模拟对象:

@Before
public void before() {
   Mockito.reset(/*mocked objects to reset*/)
   // mock them here or in individual tests
}

答案 2 :(得分:1)

如果您使用的是Mockito BDD,请按照以下步骤进行操作。

then(empRepository).should(times(3)).findById(emp.getId());