@@ -98,7 +98,9 @@ static ResolverFacade create(Class<?> clazz, List<Field> fields) {
9898 Stream .concat (uniqueIndexedParameters .values ().stream (), aggregatorParameters .stream ()) //
9999 .forEach (declaration -> makeAccessible (declaration .getField ()));
100100
101- return new ResolverFacade (clazz , uniqueIndexedParameters , aggregatorParameters , 0 );
101+ var requiredParameterCount = new RequiredParameterCount (uniqueIndexedParameters .size (), "field injection" );
102+
103+ return new ResolverFacade (clazz , uniqueIndexedParameters , aggregatorParameters , 0 , requiredParameterCount );
102104 }
103105
104106 static ResolverFacade create (Constructor <?> constructor , ParameterizedClass annotation ) {
@@ -155,27 +157,35 @@ else if (aggregatorParameters.isEmpty()) {
155157 }
156158 }
157159 return new ResolverFacade (executable , indexedParameters , new LinkedHashSet <>(aggregatorParameters .values ()),
158- indexOffset );
160+ indexOffset , null );
159161 }
160162
161163 private final int parameterIndexOffset ;
162164 private final Map <ParameterDeclaration , Resolver > resolvers ;
163165 private final DefaultParameterDeclarations indexedParameterDeclarations ;
164166 private final Set <? extends ResolvableParameterDeclaration > aggregatorParameters ;
167+ private final @ Nullable RequiredParameterCount requiredParameterCount ;
165168
166169 private ResolverFacade (AnnotatedElement sourceElement ,
167170 NavigableMap <Integer , ? extends ResolvableParameterDeclaration > indexedParameters ,
168- Set <? extends ResolvableParameterDeclaration > aggregatorParameters , int parameterIndexOffset ) {
171+ Set <? extends ResolvableParameterDeclaration > aggregatorParameters , int parameterIndexOffset ,
172+ @ Nullable RequiredParameterCount requiredParameterCount ) {
169173 this .aggregatorParameters = aggregatorParameters ;
170174 this .parameterIndexOffset = parameterIndexOffset ;
171175 this .resolvers = new ConcurrentHashMap <>(indexedParameters .size () + aggregatorParameters .size ());
172176 this .indexedParameterDeclarations = new DefaultParameterDeclarations (sourceElement , indexedParameters );
177+ this .requiredParameterCount = requiredParameterCount ;
173178 }
174179
175180 ParameterDeclarations getIndexedParameterDeclarations () {
176181 return this .indexedParameterDeclarations ;
177182 }
178183
184+ @ Nullable
185+ RequiredParameterCount getRequiredParameterCount () {
186+ return this .requiredParameterCount ;
187+ }
188+
179189 boolean isSupportedParameter (ParameterContext parameterContext , EvaluatedArgumentSet arguments ) {
180190 int index = toLogicalIndex (parameterContext );
181191 if (this .indexedParameterDeclarations .get (index ).isPresent ()) {
@@ -464,43 +474,6 @@ private static ParameterResolutionException parameterResolutionException(String
464474 return new ParameterResolutionException (fullMessage , cause );
465475 }
466476
467- private static void assertFieldAvailableOrThrow (FieldContext fieldContext , EvaluatedArgumentSet arguments ) {
468- int parameterIndex = fieldContext .getParameterIndex ();
469- int provided = arguments .getTotalLength ();
470- int required = parameterIndex + 1 ;
471-
472- if (provided < required ) {
473- Field field = fieldContext .getField ();
474- throw new org .junit .jupiter .api .extension .ParameterResolutionException (
475- ("Not enough arguments for @ParameterizedClass field injection: "
476- + "field '%s' (index %d, type %s) cannot be injected because "
477- + "only %d argument(s) were provided; at least %d are required." ).formatted (field .getName (),
478- parameterIndex , field .getType ().getName (), provided , required ));
479- }
480- }
481-
482- void assertEnoughFieldArguments (EvaluatedArgumentSet arguments ) {
483- int provided = arguments .getTotalLength ();
484- int required = determineConsumedArgumentLength (Integer .MAX_VALUE );
485-
486- if (provided < required ) {
487- int missingIndex = provided ;
488- var maybeDecl = getIndexedParameterDeclarations ().get (missingIndex );
489- if (maybeDecl .isPresent () && maybeDecl .get () instanceof FieldParameterDeclaration fpd ) {
490- Field field = fpd .getField ();
491- throw new org .junit .jupiter .api .extension .ParameterResolutionException (
492- ("Not enough arguments for @ParameterizedClass field injection: "
493- + "field '%s' (index %d, type %s) cannot be injected because "
494- + "only %d argument(s) were provided; at least %d are required." ).formatted (field .getName (),
495- missingIndex , field .getType ().getName (), provided , required ));
496- }
497- throw new org .junit .jupiter .api .extension .ParameterResolutionException (
498- "Not enough arguments for @ParameterizedClass field injection: "
499- + "index %d cannot be injected because only %d argument(s) were provided; at least %d are required." .formatted (
500- missingIndex , provided , required ));
501- }
502- }
503-
504477 private interface Resolver {
505478
506479 @ Nullable
@@ -532,7 +505,6 @@ private record Converter(ArgumentConverter argumentConverter) implements Resolve
532505 @ Override
533506 public @ Nullable Object resolve (FieldContext fieldContext , ExtensionContext extensionContext ,
534507 EvaluatedArgumentSet arguments , int invocationIndex ) {
535- ResolverFacade .assertFieldAvailableOrThrow (fieldContext , arguments );
536508
537509 Object argument = arguments .getConsumedPayload (fieldContext .getParameterIndex ());
538510 try {
@@ -791,4 +763,7 @@ public boolean supports(ParameterContext parameterContext) {
791763 invocationIndex , Optional .of (parameterContext )));
792764 }
793765 }
766+
767+ record RequiredParameterCount (int value , String reason ) {
768+ }
794769}
0 commit comments