Mockito смоделирует метод void и генерирует исключения, не выполняя код метода - PullRequest
0 голосов
/ 19 октября 2018

Я хочу издеваться над пустым методом, который может возвращать различные виды исключений.Я не хочу выполнять настоящий метод.Я просто хочу видеть правильные коды в myResponse.

public Response myMethod(String a, String b){   
    MyResponse myresponse;
    try{
        classIWantToMock.save(a,b);
         myResponse = new MyResponse("200", SUCCESSFUL_OPERATION);
         return Response.ok(myResponse, MediaType.APPLICATION_JSON).build();
    }
    catch(NotFoundException ex){
         myResponse = new MyResponse("404", ex.getMessage());
         return Response.status(Status.NOT_FOUND).entity(myResponse).type(MediaType.APPLICATION_JSON).build();
    }
    catch(BadRequestException ex){
        myResponse = new MyResponse("400", ex.getMessage());
        return  Response.status(Status.BAD_REQUEST).entity(myResponse).type(MediaType.APPLICATION_JSON).build();
    }
    catch(Exception ex){
        myResponse = new MyResponse("500", ex.getMessage());
        return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(myResponse).type(MediaType.APPLICATION_JSON).build();
    }
}

Это не работает, тест переходит в метод сохранения и вызывает исключение NullPointerException, которого я хочу избежать:

  @Test
  public void givenBadRequest_whenSaving_Then400() {
    // Given
    classIWantToMock = mock(ClassIWantToMock.class);

    // When
    doThrow(new BadRequestException("Bad Request")).when(classIWantToMock).save(isA(String.class), isA(String.class));
    response = underTest.myMethod(a, b);
    assertEquals(400, response.getStatus());
  }

TIA!

1 Ответ

0 голосов
/ 19 октября 2018

Здесь:

// Given
classIWantToMock = mock(ClassIWantToMock.class);

// When
doThrow(new BadRequestException("Bad Request")).when(classIWantToMock).save(isA(String.class), isA(String.class));
response = underTest.myMethod(a, b);

Но насмешка над классом не означает, что все поля, объявленные с типом этого класса, будут осквернены.
Действительно, вы издеваетесь над классом, который создает ложный экземплярно этот объект никогда не устанавливается в тестируемом экземпляре.Так что NPE ожидается.

ClassIWantToMock должна быть зависимостью тестируемого класса.Таким образом, вы можете установить в нем фиктивный объект.
Например, вы можете установить его в конструкторе, например:

ClassIWantToMock classIWantToMock = mock(ClassIWantToMock.class);
UnderTest underTest = new UnderTest(classIWantToMock);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...