-
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Description
Suggestion
I would like to suggest adding an API allowing for assertions during parameter verification without argument captors in simple cases.
Motivation
In my projects I generally use Mockito and AssertJ for testing. For non trivial method parameters, I often encounter the following ArgumentCaptor pattern:
ClassUnderTest classUnderTest = new ClassUnderTest(otherServiceMock);
classUnderTest.method();
ArgumentCaptor<Param> paramArgumentCaptor = ArgumentCaptor.forClass(Param.class);
verify(otherServiceMock).doStuff(paramArgumentCaptor.capture());
Param paramFromCaptor = paramArgumentCaptor.getValue();
assertThat(paramFromCaptor.getField1()).isEqualTo("value1");
assertThat(paramFromCaptor.getField2()).isEqualTo("value2");
This is fine, but a little bit verbose.
An alternative pattern I find myself using lately is using the argThat
argument matcher to eliminate the captor, resulting in the verify statement looking something like this:
verify(otherServiceMock).doStuff(argThat(param -> {
assertThat(param.getField1()).isEqualTo("value1");
assertThat(param.getField2()).isEqualTo("value2");
return true;
}));
In my opinion, at least in simple cases where only assertions on a single parameter are desired, this looks a little cleaner. Just the return statement is a bit pointless.
My suggestion is adding an API that would allow eliminating the return statement in this pattern, for example:
verify(otherServiceMock).doStuff(assertArg(param -> {
assertThat(param.getField1()).isEqualTo("value1");
assertThat(param.getField2()).isEqualTo("value2");
}));
Or is there already an API that would allow a similar pattern that I've missed?