Насколько я могу судить, это ограничение / плохая реализация.Если посмотреть на org.mockito.internal.matchers.CapturingMatcher
, то есть
public boolean matches(Object argument) {
return true;
}
, что означает, что он соответствует каждому аргументу / классу.
В результате org.mockito.internal.matchers.CapturingMatcher#getAllValues
возвращает List<B>
, но фактически содержит один A
иодин B
, приводящий к ClassCastException
во время выполнения при попытке получить их как B
.
List<Object> arguments; // the invocations
// adds a new invocation
public void captureFrom(Object argument) {
// ...
this.arguments.add(argument);
// ...
}
// return the list of arguments, using raw types remove any compiler checks for validity,
// the returned List contains elements that are not of type T
public List<T> getAllValues() {
// ...
return new ArrayList<T>((List) arguments);
// ...
}
Это должно быть решено путем изменения org.mockito.ArgumentCaptor
таким образом, чтобы оно передавало свой Class<? extends T> clazz
в CapturingMatcher
и, следовательно, надлежащим образом передают информацию о типе, обеспечивая правильную реализацию matches
и устраняя необходимость использования типа cast / raw.