Макет в исключении java

#java #junit #mocking #mockito

Вопрос:

У меня есть это заявление о подвохе:

 catch (NotFoundException ex) {
      ex.getError().setTitle(NOT_FOUND);
      throw new NotFoundException(resource, id, ex.getError());
}

 

Как я могу издеваться над этим исключением? Я пробовал это

     when(service
        .filter(eq(any()), eq(any()), eq(any())))
        .thenThrow(new NotFoundException(anyString(), anyString()));`
 

Но это дает мне ошибку с нулевым исключением из-за этой строки:

 ex.getError().setTitle(NOT_FOUND);
 

Конструктор является:

   public NotFoundException(String resource, String id, Error error) {
    this.resource = resource;
    this.ids = Collections.singletonList(id);
    this.error = error;
  }
 

И я не могу заставить переменную исключения задать заголовок или найти способ издеваться над ней.

Спасибо за вашу помощь!

Ответ №1:

 .thenThrow(new NotFoundException(anyString(), anyString()));
 

Это запрещено: anyString() только стоит непосредственно на вызове when и verify . В своем вызове для фильтрации просто используйте any() вместо eq(any()) , но в противном случае вы используете сопоставители в правильном месте.

Кроме того, похоже, что ваша тестируемая система предполагает, что ex.getError() это ненулевое значение; вероятно, вам потребуется передать полезный экземпляр ошибки в качестве параметра конструктора в создаваемое исключение NotFoundException.

 .thenThrow(new NotFoundException("foo", "bar", new Error(/* ... */)))
 

Естественно, если вашу ошибку трудно создать или с ней трудно работать, вы можете mock(Error.class) вместо этого использовать a.

Комментарии:

1. Я изменил функцию anyString() на переменные со значениями. Но у меня нет конструктора для такого поведения. Я использую junit и mockito весной.

2. @TryMe — это код исключения Not Found, который вы контролируете (или который контролирует ваша компания)? Если он принадлежит библиотеке, не могли бы вы сказать нам, из какой библиотеки он взят? В конечном счете, если ваш catch блок ожидает, что значение будет заполнено, и вы не можете предоставить его из-за деталей реализации NotFoundException, это не то, с чем могут помочь Mockito или JUnit.

3. Прости, Джефф. Исключение NotFoundException на самом деле было сделано мной, и у него есть конструктор. Я обновил вопрос. Спасибо, что уделили мне время!

4. @Попробуй, А! Тогда я имел в виду, что вы должны thenThrow(new NotFoundException("foo", "bar", new Error(/* ... */))) использовать любой экземпляр ошибки, который вам нужно создать. Я обновлю свой ответ.

5. Большое спасибо, Джефф, Это сводило меня с ума. Спасибо!