in junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/ExecutableInvoker.java [188:241]
private Object resolveParameter(ParameterContext parameterContext, Executable executable,
ExtensionContext extensionContext, ExtensionRegistry extensionRegistry) {
try {
// @formatter:off
List<ParameterResolver> matchingResolvers = extensionRegistry.stream(ParameterResolver.class)
.filter(resolver -> resolver.supportsParameter(parameterContext, extensionContext))
.collect(toList());
// @formatter:on
if (matchingResolvers.isEmpty()) {
throw new ParameterResolutionException(
String.format("No ParameterResolver registered for parameter [%s] in %s [%s].",
parameterContext.getParameter(), asLabel(executable), executable.toGenericString()));
}
if (matchingResolvers.size() > 1) {
// @formatter:off
String resolvers = matchingResolvers.stream()
.map(StringUtils::defaultToString)
.collect(joining(", "));
// @formatter:on
throw new ParameterResolutionException(
String.format("Discovered multiple competing ParameterResolvers for parameter [%s] in %s [%s]: %s",
parameterContext.getParameter(), asLabel(executable), executable.toGenericString(), resolvers));
}
ParameterResolver resolver = matchingResolvers.get(0);
Object value = resolver.resolveParameter(parameterContext, extensionContext);
validateResolvedType(parameterContext.getParameter(), value, executable, resolver);
logger.trace(() -> String.format(
"ParameterResolver [%s] resolved a value of type [%s] for parameter [%s] in %s [%s].",
resolver.getClass().getName(), (value != null ? value.getClass().getName() : null),
parameterContext.getParameter(), asLabel(executable), executable.toGenericString()));
return value;
}
catch (ParameterResolutionException ex) {
throw ex;
}
catch (Throwable throwable) {
UnrecoverableExceptions.rethrowIfUnrecoverable(throwable);
String message = String.format("Failed to resolve parameter [%s] in %s [%s]",
parameterContext.getParameter(), asLabel(executable), executable.toGenericString());
if (StringUtils.isNotBlank(throwable.getMessage())) {
message += ": " + throwable.getMessage();
}
throw new ParameterResolutionException(message, throwable);
}
}