पाठ 8 / 25
Assumptions and Conditional Execution
Skip tests conditionally with assumptions and enable/disable annotations.
Running tests only where they make sense
Some tests should run only in certain environments: on Linux, with a specific Java version, when an environment variable or system property is set, or only on CI. Conditional annotations decide before a test runs: @EnabledOnOs(OS.LINUX), @DisabledOnOs(OS.WINDOWS), @EnabledOnJre(JRE.JAVA_21), @EnabledForJreRange, @EnabledIfEnvironmentVariable(named = "CI", matches = "true"), @EnabledIfSystemProperty, and @EnabledIf("methodName") for custom logic. Assumptions decide inside a test: assumeTrue(condition) aborts the test (reported as skipped, not failed) when the condition is false, and assumingThat(condition, executable) runs part of a test only if the condition holds. Use these for genuine environment differences, such as tests that need Docker or a GPU. Do not use them to hide failing tests: a skipped test gives no protection, and a suite full of skipped tests gives false confidence. Report skipped counts in CI so they stay visible.
Environment-dependent tests
Skipped tests are reported separately from passed and failed ones.
class FileSystemTest {
@Test
@EnabledOnOs({OS.LINUX, OS.MAC})
void handlesPosixPermissions(@TempDir Path dir) throws IOException {
Path f = Files.createFile(dir.resolve("secret.txt"));
Files.setPosixFilePermissions(f, PosixFilePermissions.fromString("rw-------"));
assertThat(Files.getPosixFilePermissions(f)).hasSize(2);
}
@Test
@EnabledIfEnvironmentVariable(named = "CI", matches = "true")
void runsOnlyInCi() { /* expensive check */ }
@Test
void usesDockerWhenAvailable() {
assumeTrue(DockerProbe.isAvailable(), "Docker not available"); // skipped, not failed
// integration assertions ...
}
}An outdoor match and the weather
An assumption is like a cricket match called off for rain: it is not a loss for either team, just not played. But a season where every match is rained off tells you nothing about who is better.
त्वरित जाँच: What happens when assumeTrue(false) is called inside a test?
- The test fails
- The JVM exits
- The assertion is ignored and the test passes
- The test is aborted and reported as skipped
Answer
The test is aborted and reported as skipped — Failed assumptions abort the test as skipped rather than failed.