Skip to content

Commit f95e249

Browse files
Fail @ParameterizedTest if there are no registered ArgumentProviders (#4201)
Resolves #4146.
1 parent 6fb2ea3 commit f95e249

File tree

3 files changed

+52
-7
lines changed

3 files changed

+52
-7
lines changed

junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import static org.junit.platform.commons.support.AnnotationSupport.findRepeatableAnnotations;
1515

1616
import java.lang.reflect.Method;
17+
import java.util.List;
1718
import java.util.Optional;
1819
import java.util.concurrent.atomic.AtomicLong;
1920
import java.util.stream.Stream;
@@ -74,8 +75,13 @@ public Stream<TestTemplateInvocationContext> provideTestTemplateInvocationContex
7475
ParameterizedTestNameFormatter formatter = createNameFormatter(extensionContext, methodContext);
7576
AtomicLong invocationCount = new AtomicLong(0);
7677

78+
List<ArgumentsSource> argumentsSources = findRepeatableAnnotations(methodContext.method, ArgumentsSource.class);
79+
80+
Preconditions.notEmpty(argumentsSources,
81+
"Configuration error: You must configure at least one arguments source for this @ParameterizedTest");
82+
7783
// @formatter:off
78-
return findRepeatableAnnotations(methodContext.method, ArgumentsSource.class)
84+
return argumentsSources
7985
.stream()
8086
.map(ArgumentsSource::value)
8187
.map(clazz -> ParameterizedTestSpiInstantiator.instantiate(ArgumentsProvider.class, clazz, extensionContext))

jupiter-tests/src/test/java/org/junit/jupiter/params/ParameterizedTestExtensionTests.java

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -146,16 +146,23 @@ void throwsExceptionWhenParameterizedTestIsNotInvokedAtLeastOnce() {
146146

147147
@Test
148148
void doesNotThrowExceptionWhenParametrizedTestDoesNotRequireArguments() {
149-
var extensionContextWithAnnotatedTestMethod = getExtensionContextReturningSingleMethod(
150-
new TestCaseAllowNoArgumentsMethod());
149+
var extensionContext = getExtensionContextReturningSingleMethod(new TestCaseAllowNoArgumentsMethod());
151150

152-
var stream = this.parameterizedTestExtension.provideTestTemplateInvocationContexts(
153-
extensionContextWithAnnotatedTestMethod);
151+
var stream = this.parameterizedTestExtension.provideTestTemplateInvocationContexts(extensionContext);
154152
// cause the stream to be evaluated
155153
stream.toArray();
156154
stream.close();
157155
}
158156

157+
@Test
158+
void throwsExceptionWhenParameterizedTestHasNoArgumentsSource() {
159+
var extensionContext = getExtensionContextReturningSingleMethod(new TestCaseWithNoArgumentsSource());
160+
161+
assertThrows(PreconditionViolationException.class,
162+
() -> this.parameterizedTestExtension.provideTestTemplateInvocationContexts(extensionContext),
163+
"Configuration error: You must configure at least one arguments source for this @ParameterizedTest");
164+
}
165+
159166
@Test
160167
void throwsExceptionWhenArgumentsProviderIsNotStatic() {
161168
var extensionContextWithAnnotatedTestMethod = getExtensionContextReturningSingleMethod(
@@ -323,19 +330,36 @@ void method() {
323330

324331
static class TestCaseWithAnnotatedMethod {
325332

326-
@SuppressWarnings("JUnitMalformedDeclaration")
327333
@ParameterizedTest
334+
@ArgumentsSource(ZeroArgumentsProvider.class)
328335
void method() {
329336
}
330337
}
331338

332339
static class TestCaseAllowNoArgumentsMethod {
333340

334341
@ParameterizedTest(allowZeroInvocations = true)
342+
@ArgumentsSource(ZeroArgumentsProvider.class)
335343
void method() {
336344
}
337345
}
338346

347+
static class TestCaseWithNoArgumentsSource {
348+
349+
@ParameterizedTest(allowZeroInvocations = true)
350+
@SuppressWarnings("JUnitMalformedDeclaration")
351+
void method() {
352+
}
353+
}
354+
355+
static class ZeroArgumentsProvider implements ArgumentsProvider {
356+
357+
@Override
358+
public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
359+
return Stream.empty();
360+
}
361+
}
362+
339363
static class ArgumentsProviderWithCloseHandlerTestCase {
340364

341365
@ParameterizedTest

jupiter-tests/src/test/java/org/junit/jupiter/params/ParameterizedTestIntegrationTests.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ void failsWhenArgumentsRequiredButNoneProvided() {
457457
}
458458

459459
@Test
460-
void failsWhenArgumentsAreNotRequiredAndNoneProvided() {
460+
void doesNotFailWhenArgumentsAreNotRequiredAndNoneProvided() {
461461
var result = execute(ZeroArgumentsTestCase.class, "testThatDoesNotRequireArguments", String.class);
462462
result.allEvents().assertEventsMatchExactly( //
463463
event(engine(), started()), event(container(ZeroArgumentsTestCase.class), started()),
@@ -467,6 +467,15 @@ void failsWhenArgumentsAreNotRequiredAndNoneProvided() {
467467
event(engine(), finishedSuccessfully()));
468468
}
469469

470+
@Test
471+
void failsWhenNoArgumentsSourceIsDeclared() {
472+
var result = execute(ZeroArgumentsTestCase.class, "testThatHasNoArgumentsSource", String.class);
473+
result.containerEvents().assertThatEvents() //
474+
.haveExactly(1, //
475+
event(displayName("testThatHasNoArgumentsSource(String)"), finishedWithFailure(message(
476+
"Configuration error: You must configure at least one arguments source for this @ParameterizedTest"))));
477+
}
478+
470479
private EngineExecutionResults execute(DiscoverySelector... selectors) {
471480
return EngineTestKit.engine(new JupiterTestEngine()).selectors(selectors).execute();
472481
}
@@ -2428,6 +2437,12 @@ void testThatDoesNotRequireArguments(String argument) {
24282437
fail("This test should not be executed, because no arguments are provided.");
24292438
}
24302439

2440+
@ParameterizedTest(allowZeroInvocations = true)
2441+
@SuppressWarnings("JUnitMalformedDeclaration")
2442+
void testThatHasNoArgumentsSource(String argument) {
2443+
fail("This test should not be executed, because no arguments source is declared.");
2444+
}
2445+
24312446
public static Stream<Arguments> zeroArgumentsProvider() {
24322447
return Stream.empty();
24332448
}

0 commit comments

Comments
 (0)