У меня есть следующие проблемы, используя Mockito для модульного тестирования:Как издеваются вызов метода с использованием Mockito
У меня есть этот метод:
@Override
public void handle(HttpExchange httpRequest) throws IOException {
Object[] outputResult = processRequest(httpRequest);
String response = (String) outputResult[0];
Integer responseCode = (Integer) outputResult[1];
httpRequest.sendResponseHeaders(responseCode, response.length());
OutputStream os = httpRequest.getResponseBody();
os.write(response.getBytes());
os.close();
}
И я хочу только, чтобы проверить этот метод, а не processRequestMethod
который называется внутренне (что я хотел бы проверить отдельно в тесте anthoer), поэтому мне нужно высмеять его и проверить в конце теста, что методы записи и закрытия класса OutputStream
были вызваны.
Я попробовал два пути, но не повезло ни с одной из них:
@Test
public void handleTest() throws IOException {
RequestHandler requestHandler=mock(RequestHandler.class);
String response = "Bad request";
int responseCode = HttpURLConnection.HTTP_BAD_REQUEST;
Object[] result={response,responseCode};
when(requestHandler.processRequest(anyObject())).thenReturn(result);
when (httpExchange.getResponseBody()).thenReturn(outputStream);
requestHandler.handle(httpExchange);
Mockito.verify(outputStream,times(1)).write(anyByte());
Mockito.verify(outputStream,times(1)).close();
}
С выше коде метод processRequest
не не называется, но ни один метод ручки, что я хочу, чтобы проверить, так испытание не выполнено в строке:
Mockito.verify(outputStream,times(1)).write(anyByte());
Сказать, что этот метод вообще не был вызван.
Однако, если добавить параметр CALL_REAL_METHODS
при создании издеваться, как это:
@Test
public void handleTest() throws IOException {
RequestHandler requestHandler=mock(RequestHandler.class,CALLS_REAL_METHODS);
String response = "Bad request";
int responseCode = HttpURLConnection.HTTP_BAD_REQUEST;
Object[] result={response,responseCode};
when(requestHandler.processRequest(anyObject())).thenReturn(result);
when (httpExchange.getResponseBody()).thenReturn(outputStream);
requestHandler.handle(httpExchange);
Mockito.verify(outputStream,times(1)).write(anyByte());
Mockito.verify(outputStream,times(1)).close();
}
Тогда processRequest
метод, который я хочу, чтобы пропустить на самом деле вызывается, когда метод выполняет эту строку:
when(requestHandler.processRequest(anyObject())).thenReturn(result);
Любые подсказки, что может быть неправильным?
Не знал о шпионе. Оно работало завораживающе. Благодаря! – fgonzalez