2017-01-09 2 views
1

Я использую Junit и Mockito для проверки вперед. Вот часть PortalServletTest класса:Mockito TooManyActualInvocations

@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 .вперед(,); Требуется 1 раз: -> в xxx.PortalServletTest.testSuccesfulRequest (PortalServletTest.java:140)

Но был в 2 раза. Нежелательные призывание: -> в xxx.PortalServlet.addRequestHeaders (PortalServlet.java:144)

на xxx.PortalServletTest.testSuccesfulRequest (PortalServletTest.java:140)

Если я бегу каждого теста по отдельности они проходят ОК. Похоже, что форвард от PortalServlet засчитывается дважды для каждого теста. Любое предложение, как решить эту проблему?

Заранее спасибо.

+0

Показать полный код PortalServletTest. Я предполагаю, что вы инициализируете mock instance PortalServlet только один раз для всех тестов. –

ответ

1

В дополнение к тому, что написал @GhostCat, я думаю, вы должны reset все издевались объекты перед испытаниями:

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

Спасибо за вашу помощь, Я закончил добавление Mockito.reset (ответ, rd) в конце каждого теста. public void testMissingHeadersRequest() throws IOException { \t \t когда (request.getHeader (Mockito.anyString())). ThenReturn (null); \t \t target(). Path ("/ portal"). Request().получить(); \t \t Mockito.verify (response, times (1)). SendError (HttpServletResponse.SC_USE_PROXY, PortalServlet.MISSING_HEADERS_MSG); \t \t Mockito.reset (response, rd); \t} Это решит проблему :) – Israel

+0

Прохладный! :) пожалуйста! – Enigo

+0

Ницца ... пропустил эту часть ... плюс один от меня за это! – GhostCat

0

Вы используете @BeforeClass для настройки своих макетных объектов.

Этот метод называется после перед тем, как ваши @ Тесты в вашем тестовом классе выполняются.

Вы могли бы просто попытаться изменить это на @Before!

Другими словами: перед выполнением любых проверок вы настраиваете свои макеты, чтобы разрешить один звонок. Но тогда вы выполняете несколько тестов. Если вы предполагаете, что ваши макеты все используются одинаково, вы просто перенастраиваете их каждый раз для каждого метода @Test.

Учитывая Ваш комментарий: делает это

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

работа/помощь?

+0

Спасибо за ваш ответ, я пробовал с @Before и получал то же сообщение об ошибке. Я также проверил, что макет настраивается перед каждым тестом. – Israel

+0

Странно. См. Мой обновленный ответ ... – GhostCat