@EnumSource helps run the same test with all values of an enum. This saves time and avoids writing many similar tests.
@EnumSource for enum values in JUnit
@ParameterizedTest
@EnumSource(EnumClassName.class)
void testMethod(EnumClassName value) {
// test code using value
}The test method receives each enum value one by one.
Use @EnumSource with the enum class name to specify which enum to use.
@ParameterizedTest
@EnumSource(Color.class)
void testColor(Color color) {
assertNotNull(color);
}@ParameterizedTest @EnumSource(value = Size.class, names = {"SMALL", "MEDIUM"}) void testSize(Size size) { assertTrue(size == Size.SMALL || size == Size.MEDIUM); }
This test runs three times, once for each day in the Day enum. It checks that the day value is not null.
import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; enum Day { MONDAY, TUESDAY, WEDNESDAY } public class EnumSourceTest { @ParameterizedTest @EnumSource(Day.class) void testDayIsNotNull(Day day) { assertNotNull(day); } }
You can filter enum values using the 'names' attribute in @EnumSource.
Use @EnumSource when you want to test all or some enum values without writing loops.
@EnumSource runs tests for each enum value automatically.
It helps test all fixed options easily and clearly.
Practice
What is the main purpose of using @EnumSource in JUnit tests?
Solution
Step 1: Understand the role of @EnumSource
@EnumSource is an annotation in JUnit that provides enum values as parameters to a test method.Step 2: Identify what it does in tests
It runs the test method once for each enum constant, so all enum values are tested automatically.Final Answer:
To run the test method once for each value of an enum automatically -> Option DQuick Check:
@EnumSource runs tests per enum value = D [OK]
- Thinking @EnumSource creates enums
- Believing it skips enum values
- Confusing it with string conversion
Which of the following is the correct syntax to use @EnumSource for an enum named Status in a JUnit 5 parameterized test?
@ParameterizedTest
@EnumSource(??? )
void testStatus(Status status) { ... }Solution
Step 1: Recall correct @EnumSource syntax
The annotation requires the enum class name with .class, like Status.class.Step 2: Check each option
@EnumSource(Status.class) uses Status.class which is correct syntax. Others are invalid Java or annotation syntax.Final Answer:
@EnumSource(Status.class) -> Option AQuick Check:
Use enum class with .class in @EnumSource = A [OK]
- Omitting .class after enum name
- Using string instead of class reference
- Adding invalid parameters
Given the enum Color { RED, GREEN, BLUE } and the test:
@ParameterizedTest
@EnumSource(Color.class)
void testColor(Color color) {
System.out.println(color);
}What will be the output when this test runs?
Solution
Step 1: Understand @EnumSource behavior
@EnumSource runs the test once for each enum constant in the order declared.Step 2: Identify output from System.out.println
Each test run prints the enum value. So output lines are RED, then GREEN, then BLUE.Final Answer:
RED GREEN BLUE -> Option CQuick Check:
Test runs once per enum value in order = C [OK]
- Assuming only some enum values run
- Thinking output order is random
- Expecting test failure without reason
Consider this test code snippet:
@ParameterizedTest
@EnumSource(Status.class)
void testStatus(String status) {
assertNotNull(status);
}What is the main problem here?
Solution
Step 1: Check parameter type vs enum type
@EnumSource(Status.class) passes enum constants of type Status, but method expects String parameter.Step 2: Understand type mismatch impact
This causes a runtime error because JUnit cannot convert Status enum to String automatically.Final Answer:
The test method parameter type does not match the enum type -> Option AQuick Check:
Parameter type must match enum type = A [OK]
- Using String instead of enum type as parameter
- Thinking @EnumSource only works with strings
- Assuming test method must be static
You want to test only specific enum values OPEN and CLOSED from the enum TicketStatus { OPEN, IN_PROGRESS, CLOSED, REOPENED } using @EnumSource. Which is the correct way to do this?
Solution
Step 1: Recall how to filter enum values in @EnumSource
@EnumSource supports a 'names' attribute to specify which enum constants to include.Step 2: Check each option's syntax
@EnumSource(value = TicketStatus.class, names = {"OPEN", "CLOSED"}) uses 'names' with string array correctly. Others use invalid or unsupported attributes.Final Answer:
@EnumSource(value = TicketStatus.class, names = {"OPEN", "CLOSED"}) -> Option BQuick Check:
Use 'names' to select enum values in @EnumSource = B [OK]
- Using unsupported attributes like include or only
- Passing enum constants instead of strings in names
- Forgetting to specify value = Enum.class
Ready to prove it?
Pass the test and this pattern moves unknown
