@EnabledIfSystemProperty in JUnit - Build an Automation Script
import org.junit.jupiter.api.*; import org.junit.jupiter.api.condition.EnabledIfSystemProperty; import static org.junit.jupiter.api.Assertions.assertTrue; public class EnabledIfSystemPropertyTest { @BeforeEach void clearProperty() { System.clearProperty("env"); } @Test @EnabledIfSystemProperty(named = "env", matches = "test") void testRunsOnlyIfEnvIsTest() { // This test runs only if system property 'env' equals 'test' String env = System.getProperty("env"); assertTrue("test".equals(env), "System property 'env' should be 'test'"); } @Test void testAlwaysRuns() { // Control test to show normal test execution assertTrue(true); } public static void main(String[] args) { // Example to run tests with system property set System.setProperty("env", "test"); org.junit.platform.launcher.LauncherDiscoveryRequest request = org.junit.platform.engine.discovery.DiscoverySelectors.selectClass(EnabledIfSystemPropertyTest.class); // Normally tests run via IDE or build tool } }
The test class EnabledIfSystemPropertyTest contains a test method testRunsOnlyIfEnvIsTest annotated with @EnabledIfSystemProperty. This annotation makes the test run only if the system property named env matches the value test.
Before each test, the system property env is cleared to avoid side effects. To run the conditional test, set the system property env to test before running the tests.
The assertion inside the test confirms that the system property is indeed test when the test runs.
Another test testAlwaysRuns is included to show a normal test that always runs.
This setup helps beginners understand how to use @EnabledIfSystemProperty to conditionally run tests based on environment settings.
Now add data-driven testing with 3 different system property values ('test', 'dev', 'prod') and verify which tests run.
Practice
@EnabledIfSystemProperty annotation in JUnit tests?Solution
Step 1: Understand the annotation's purpose
<code>@EnabledIfSystemPropertyStep 2: Analyze the options
To run a test only if a specific system property matches a given value correctly states that the test runs only if a system property matches a value. Options B, C, and D describe unrelated behaviors.Final Answer:
To run a test only if a specific system property matches a given value -> Option CQuick Check:
@EnabledIfSystemProperty = Conditional test run [OK]
- Confusing it with @Disabled or @Enabled annotations
- Thinking it runs tests based on date or time
- Assuming it runs tests multiple times automatically
env equals prod using @EnabledIfSystemProperty?Solution
Step 1: Recall the annotation parameters
The correct parameters arenamedfor the system property name andmatchesfor the regex pattern to match.Step 2: Compare options with correct syntax
@EnabledIfSystemProperty(named = "env", matches = "prod") usesnamedandmatchescorrectly. Other options use incorrect parameter names.Final Answer:
@EnabledIfSystemProperty(named = "env", matches = "prod") -> Option AQuick Check:
named + matches = correct syntax [OK]
- Using 'name' instead of 'named'
- Using 'value' or 'equals' instead of 'matches'
- Mixing parameter names incorrectly
@EnabledIfSystemProperty(named = "os.name", matches = "Windows.*")
void testWindowsFeature() {
System.out.println("Windows test executed");
}If the system property
os.name is set to Windows 10, what will be the output when running this test?Solution
Step 1: Understand the system property condition
The test runs only ifos.namematches the regexWindows.*. The valueWindows 10matches this pattern.Step 2: Predict test behavior
Since the condition is true, the test runs and prints "Windows test executed".Final Answer:
Windows test executed -> Option BQuick Check:
Property matches regex = test runs [OK]
- Assuming test skips because of partial match
- Expecting exceptions from annotation
- Confusing output with test failure
@EnabledIfSystemProperty(named = "user.language", matches = "en")
void testEnglishFeature() {
// test code
}The test never runs even when the system property
user.language is set to en. What is the most likely cause?Solution
Step 1: Check system property availability
If the system propertyuser.languageis not set before running tests, the condition fails and test is skipped.Step 2: Validate other options
The regex pattern should be "en.*" to match properly is unnecessary because exact match "en" works. The annotation parameter should be 'name' not 'named' is incorrect because 'named' is the correct parameter. JUnit does not support @EnabledIfSystemProperty is false; JUnit supports this annotation.Final Answer:
The system property is not set before test execution -> Option AQuick Check:
Property must be set before test runs [OK]
- Confusing 'named' with 'name' parameter
- Assuming regex must be partial match
- Believing JUnit lacks support for this annotation
env is set to either dev or test. Which @EnabledIfSystemProperty annotation correctly implements this?Solution
Step 1: Understand regex for multiple options
The regexdev|testmeans match either "dev" or "test" exactly.Step 2: Evaluate each option's regex
@EnabledIfSystemProperty(named = "env", matches = "dev|test") uses correct regex with alternation. @EnabledIfSystemProperty(named = "env", matches = "dev,test") uses comma which matches literal comma, not alternation. @EnabledIfSystemProperty(named = "env", matches = "[dev,test]") uses square brackets which match single characters, not words. @EnabledIfSystemProperty(named = "env", matches = "dev?test") uses question mark which means optional character, not alternation.Final Answer:
@EnabledIfSystemProperty(named = "env", matches = "dev|test") -> Option DQuick Check:
Use regex alternation with | for multiple matches [OK]
- Using commas instead of | in regex
- Using square brackets which match single chars
- Misusing ? for alternation
Ready to prove it?
Pass the test and this pattern moves unknown
