У меня есть большая sh кодовая база со многими классами-декораторами, которые обычно делегируют все методы, кроме одного, объекту-делегату, то есть примерно так: , используя Junit 5 @TestFactory
, вызывая каждый из методов на WrapperThing
, и хотите убедиться, что был вызов обернутого делегата, который является имитацией Mockito.
Вот мой код, поэтому far:
private void testMethodDelegation(final Method method) {
D delegate = mock(delegateType);
W wrapper = createWrapper(delegate);
List<Object> args = new ArrayList<>(method.getParameterTypes().length + 1);
args.add(wrapper);
gatherMethodArgs(method, args); // populate args with mocks or default values
try {
method.invoke(args.toArray(new Object[0]));
}catch(Exception e) {
// this is fine, we're just testing the delegation
}
// now comes the verify part
List<Object> mockArgs = new ArrayList<>();
try {
mockArgs.add(verify(delegate));
mockArgs.addAll(nCopies(args.size()-1, any()));
method.invoke(mockArgs.toArray(new Object[0]));
}catch (Exception e) {
throw new IllegalStateException(e);
}
}
Когда я запускаю это, я получаю сообщение об ошибке:
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Misplaced or misused argument matcher detected here:
-> at some.packagename.AbstractDelegateTest.testMethodDelegation(AbstractDelegateTest.java:81)
You cannot use argument matchers outside of verification or stubbing.
Examples of correct usage of argument matchers:
when(mock.get(anyInt())).thenReturn(null);
doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());
verify(mock).someMethod(contains("foo"))
Я делаю что-то не так, или невозможно проверить вызов метода, если вы не Не знаете точный метод?