У меня есть кусок кода, то есть метод с блоком try и catch.Блок catch перехватывает исключение, как я могу записать для него junit сбоя? - PullRequest
0 голосов
/ 19 декабря 2018

Ниже приведен фрагмент кода.Теперь уже исключение поймано.Как я могу написать отрицательный тест для того же?Чтобы убедиться, что код входит в блок catch?

public ThirdPartyResponse load(ThirdPartyRequestContext context) {

    ThirdPartyResponse thirdPartyResponse = new ThirdPartyResponse();
    try
    {
        thirdPartyResponse.setData(getData(context));
    }catch (Exception e)
    {
        LOGGER.error("Error executing {}", context.getEndpoint(), e);
        thirdPartyResponse.setData(Collections.emptyList());
        thirdPartyResponse.setErrorMessage(e.getMessage());
    }
    return thirdPartyResponse;
}

Ответы [ 4 ]

0 голосов
/ 19 декабря 2018

Поскольку вы используете mockito, попробуйте следующее:

1) Измените метод load, чтобы thirdPartyResponse был вызовом защищенного метода:

public ThirdPartyResponse load(ThirdPartyRequestContext context) {

    ThirdPartyResponse thirdPartyResponse = createThirdPartyResponse();

2) Поместите создание этого объекта в createThirdPartyResponse():

protected ThirdPartyResponse createThirdPartyResponse(){
   return new ThirdPartyResponse(); 
}

3) Шпионите за SUT и смейтесь над методом createThirdPartyResponse:

public class ClassUnderTest{

   @Spy 
   ClassUnderTest classUnderTestSpy;

   @Spy
   ThirdPartyResponse thirdPartyResponseSpy;

   @BeforeClass
   public void init(){
      MockitoAnnotations.initMocks(this);
   }

   public void expectExceptionOnLoad(){
      // Arrange
      Mockito.doThrow(new Exception()).when(thirdPartyResponseMock.setData(Mockito.any(Object.class));

     Mockito.doReturn(thirdPartyResponseSpy).when(classUnderTestSpy).createThirdPartyResponse();

       // Act
       classUnderTestSpy.load(context);

       // Assert
       assertNotNull(thirdPartyResponseSpy.getErrorMessage());
   }
}

PS.вам нужно заменить Mockito.any(Object.class) на соответствующий класс

0 голосов
/ 19 декабря 2018

Во-первых, не пытайтесь поймать основной "Exception" в catch, так как он поймает все виды исключений, которые вы, возможно, даже не захотите поймать.Далее, если вы хотите написать тестовый пример, для которого вам нужно использовать Mockito для выполнения этого негативного теста, вам нужно написать что-то вроде этого

Mockito.when(some_method(anyparam())).thenThrow(new YourCustomException("error message"));

, возможно, вам, возможно, понадобится смоделировать внутри getData()метод.

0 голосов
/ 19 декабря 2018

Вы можете утверждать, что сообщение об ошибке не является нулевым для объекта ThirdPartyResponse, который возвращается из вашего метода:

assertNotNull(thirdPartyResponse.getErrorMessage());

оператор импорта:

import static org.junit.Assert.assertNotNull;
0 голосов
/ 19 декабря 2018
// mock context so that getData(context) throws exception with message "foo"
...
ThirdPartyResponse response = load(context);
assertThat(response.getMessage(), is("foo"));
...