1) Имеем JUnit Extension, который кладет в context List<CategoryJson> :
final List<CategoryJson> result = new ArrayList<>();
context.getStore(NAMESPACE).put(
context.getUniqueId(),
result
);
2) Имеем желание прокинуть этот
List<T> через ParameterResolver в виде массива в аргументы теста:@Override
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
return parameterContext.getParameter().getType().isAssignableFrom(CategoryJson[].class);
}
@Override
@SuppressWarnings("unchecked")
public CategoryJson[] resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
return (CategoryJson[]) extensionContext.getStore(NAMESPACE).get(extensionContext.getUniqueId(), List.class)
.stream()
.toArray(CategoryJson[]::new);
}
3) А теперь самое интересное 🙂 Этот код - работает, но IDEA его подсвечивает: Can be replaced with Collection.toArray(). Соглашаемся, и наш метод resolveParameter принимает вид:
1️⃣было :
return (CategoryJson[]) extensionContext.getStore(NAMESPACE).get(extensionContext.getUniqueId(), List.class)
.stream()
.toArray(CategoryJson[]::new);
2️⃣стало :
return (CategoryJson[]) extensionContext.getStore(NAMESPACE).get(extensionContext.getUniqueId(), List.class).toArray();
И тест с таким кодом не запускается, мы имеем ошибку:
java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [...model.CategoryJson; ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; [...model.CategoryJson; is in unnamed module of loader 'app')
C точки зрения моего понимания - все ок, мы действительно потеряли Method Reference
CategoryJson[]::new и теперь наш массив имеет тип Object[] (хотя под капотом там на самом деле CategoryJson[] 🥲), но, потеряли-то мы его просто согласившись через ALT + ENTER с подсказкой IDEA. При этом весь контекст (в виде type casting), казалось бы, есть - ну убери просто лишний stream(), зачем убирать CategoryJson[]::new ?