Sometimes tests should run only on certain operating systems. @EnabledOnOs helps run tests only on the OS you want.
@EnabledOnOs for OS-specific tests in JUnit
@EnabledOnOs(OS.WINDOWS)
void testMethod() {
// test code
}You can specify one or more OS values inside @EnabledOnOs.
This annotation is part of JUnit 5 and helps control test execution based on OS.
@EnabledOnOs(OS.WINDOWS)
void testWindowsOnly() {
// test code for Windows
}@EnabledOnOs({OS.MAC, OS.LINUX})
void testUnixLike() {
// test code for Mac and Linux
}@EnabledOnOs(OS.LINUX)
void testLinuxOnly() {
// test code for Linux
}This class has two tests. One runs only on Windows, the other runs only on Mac and Linux. When you run the tests on your OS, only the matching tests run.
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; public class OsSpecificTest { @Test @EnabledOnOs(OS.WINDOWS) void testRunsOnlyOnWindows() { System.out.println("Running Windows-specific test"); // Imagine some Windows-only logic tested here } @Test @EnabledOnOs({OS.MAC, OS.LINUX}) void testRunsOnMacAndLinux() { System.out.println("Running Mac/Linux-specific test"); // Imagine some Unix-like OS logic tested here } }
If you run the sample on Windows, only the Windows test prints its message.
On Mac or Linux, only the Mac/Linux test prints its message.
Tests skipped by @EnabledOnOs are marked as skipped in the test report.
@EnabledOnOs runs tests only on specified operating systems.
Use it to avoid running tests where they don't apply or would fail.
It helps keep test runs fast and relevant to the environment.
Practice
@EnabledOnOs annotation in JUnit?Solution
Step 1: Understand the role of
This annotation controls on which operating systems a test should run.@EnabledOnOsStep 2: Compare with other options
Options B, C, and D describe different functionalities unrelated to OS-specific test execution.Final Answer:
To run a test only on specified operating systems -> Option DQuick Check:
@EnabledOnOs = Run test on specific OS [OK]
- Confusing @EnabledOnOs with disabling tests
- Assuming it controls Java version
- Thinking it manages test parallelism
@EnabledOnOs?Solution
Step 1: Recall the correct enum usage
The@EnabledOnOsannotation uses the enumOSwith constants likeWINDOWS.Step 2: Check each option's syntax
@EnabledOnOs(OS.WINDOWS)uses the correct enum constantOS.WINDOWS. Options A, B, and C use invalid syntax or strings instead of enum constants.Final Answer:
@EnabledOnOs(OS.WINDOWS) -> Option AQuick Check:
Use enum OS.WINDOWS for Windows [OK]
- Using string literals instead of enum constants
- Using incorrect enum names like OS.WIN
- Adding parameters incorrectly
@Test
@EnabledOnOs(OS.WINDOWS)
void testOnlyOnWindows() {
System.out.println("Running Windows test");
}Solution
Step 1: Understand the annotation effect on Linux
The test is enabled only on Windows OS, so on Linux it should not run.Step 2: Determine test behavior on unsupported OS
JUnit skips tests annotated with@EnabledOnOsif the current OS does not match.Final Answer:
The test will be skipped and not run -> Option BQuick Check:
Test runs only on Windows, skipped on Linux [OK]
- Assuming test runs but prints nothing
- Expecting a failure or exception
- Thinking test runs on all OS by default
@Test
@EnabledOnOs(OS.LINUX, OS.MAC)
void testOnUnix() {
// test code
}Solution
Step 1: Check annotation parameter format
The@EnabledOnOsannotation expects an array of OS enums when specifying multiple OSes.Step 2: Identify correct syntax
Correct syntax is@EnabledOnOs({OS.LINUX, OS.MAC}). The code misses curly braces for the array. Thus, Multiple OS values must be inside an array correctly identifies that multiple OS values must be inside an array.Final Answer:
Multiple OS values must be inside an array -> Option CQuick Check:
Use curly braces for multiple OS enums [OK]
- Omitting curly braces for multiple OS values
- Confusing @EnabledOnOs with @DisabledOnOs
- Thinking method must be static
@EnabledOnOs annotation for this requirement?Solution
Step 1: Understand how to specify multiple OSes
Multiple OSes must be provided as an array inside curly braces in@EnabledOnOs.Step 2: Evaluate each option
@EnabledOnOs({OS.WINDOWS, OS.MAC}) correctly uses an array withOS.WINDOWSandOS.MAC. @EnabledOnOs(OS.WINDOWS, OS.MAC, OS.LINUX) includes Linux, which should be excluded. @EnabledOnOs(OS.WINDOWS) @EnabledOnOs(OS.MAC) uses multiple annotations, which is invalid. @EnabledOnOs(OS.WINDOWS & OS.MAC) uses an invalid bitwise operator.Final Answer:
@EnabledOnOs({OS.WINDOWS, OS.MAC}) -> Option AQuick Check:
Use array with OS enums to include multiple OSes [OK]
- Including unwanted OS like Linux
- Using multiple @EnabledOnOs annotations
- Using invalid operators like &
Ready to prove it?
Pass the test and this pattern moves unknown
