#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. Большое спасибо, Джефф, Это сводило меня с ума. Спасибо!