2016-12-10 4 views
1

У меня есть следующие проблемы, используя 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); 

Любые подсказки, что может быть неправильным?

ответ

3

в тесте вместо

RequestHandler requestHandler=mock(RequestHandler.class,CALLS_REAL_METHODS); 

использования Mockito.spy():

 RequestHandler requestHandler=spy(RequestHandler.class); 
     doReturn(result).when(requestHandler).processRequest(httpRequest); 

вы можете в doReturn().when() форму, а не на when().thenReturn(), потому что первый делает не выполнить метод тогда как последнее делает.


С другой стороны, я предпочел бы, чтобы переместить processRequest() в другой класс, где можно впрыснуть экземпляр в RequestHandler который бы насмехаясь более прямо ...

+0

Не знал о шпионе. Оно работало завораживающе. Благодаря! – fgonzalez

Смежные вопросы