Issue
I have this catch statement:
catch (NotFoundException ex) {
ex.getError().setTitle(NOT_FOUND);
throw new NotFoundException(resource, id, ex.getError());
}
How can I mock this exception? I've tried this
when(service
.filter(eq(any()), eq(any()), eq(any())))
.thenThrow(new NotFoundException(anyString(), anyString()));`
But it gives me a null exception error because of this line:
ex.getError().setTitle(NOT_FOUND);
The constructor is:
public NotFoundException(String resource, String id, Error error) {
this.resource = resource;
this.ids = Collections.singletonList(id);
this.error = error;
}
And I can't get the exception variable to set the title, or find an way to mock it.
Thanks for you help!
Solution
.thenThrow(new NotFoundException(anyString(), anyString()));
This isn't allowed: anyString()
only stands directly in for the call in when
and verify
. In your call to filter, simply use any()
rather than eq(any())
, but you're otherwise using matchers in the correct place.
Furthermore, it looks like your system-under-test assumes that ex.getError()
is non-null; it is likely that you'll need to pass in a useful Error instance as constructor parameter into the NotFoundException you create.
.thenThrow(new NotFoundException("foo", "bar", new Error(/* ... */)))
Naturally, if your Error is difficult to create or work with, you might use a mock(Error.class)
instead.
Answered By - Jeff Bowman
Answer Checked By - Gilberto Lyons (JavaFixing Admin)