This test checks if the OS name contains "Windows" only when the OS is Windows. On other OS, the assertion is skipped.
JUnit
import static org.junit.jupiter.api.Assumptions.assumingThat;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
public class ConditionalTest {
@Test
void testFeatureOnlyOnWindows() {
String os = System.getProperty("os.name");
assumingThat(os.startsWith("Windows"), () -> {
// This assertion runs only on Windows
assertTrue(os.contains("Windows"));
});
}
}
OutputSuccess
Important Notes
If the condition is false, the code inside assumingThat is skipped, not failed.
This helps avoid false failures when tests don't apply.
Summary
assumingThat runs assertions only if a condition is true.
It helps skip tests that don't apply in some situations.
Use it to make tests smarter and avoid unnecessary failures.
Practice
(1/5)
1. What is the main purpose of assumingThat in JUnit tests?
easy
A. To run assertions only if a specific condition is true
B. To always run assertions regardless of conditions
C. To skip all tests unconditionally
D. To replace all assertions with print statements
Solution
Step 1: Understand the role of assumingThat
assumingThat is used to run assertions only when a given condition is true, otherwise it skips them.
Step 2: Compare options with this behavior
Only "To run assertions only if a specific condition is true" correctly describes this conditional behavior. Options A, B, and C do not match the purpose.
Final Answer:
To run assertions only if a specific condition is true -> Option A
Quick Check:
Conditional assertions = run only if true [OK]
Hint: Remember: assumingThat runs assertions only when condition is true [OK]
Common Mistakes:
Thinking assumingThat always runs assertions
Confusing assumingThat with skipping all tests
Believing assumingThat replaces assertions
2. Which of the following is the correct syntax to use assumingThat in a JUnit 5 test?
easy
A. assumingThat(assertEquals(5, result), condition);
B. assumingThat(condition, assertEquals(5, result));
C. assumingThat(condition, () -> assertEquals(5, result));
D. assumingThat(() -> assertEquals(5, result), condition);
Solution
Step 1: Recall the method signature of assumingThat
It takes a boolean condition first, then a lambda expression with assertions.
Step 2: Match options to this signature
assumingThat(condition, () -> assertEquals(5, result)); matches: assumingThat(condition, () -> assertion). Others have wrong order or missing lambda.
Final Answer:
assumingThat(condition, () -> assertEquals(5, result)); -> Option C
int value = 10;
assumingThat(value > 5, () -> assertTrue(value < 20));
assumingThat(value < 5, () -> assertTrue(value > 0));
What will be the result of running this test?
medium
A. Both assertions run and pass
B. First assertion runs and passes; second is skipped
C. First assertion fails; second runs and passes
D. Both assertions are skipped
Solution
Step 1: Evaluate the first condition and assertion
Condition: value > 5 is true (10 > 5). So assertion value < 20 runs and passes.
Step 2: Evaluate the second condition and assertion
Condition: value < 5 is false (10 < 5). So assertion value > 0 is skipped.
Final Answer:
First assertion runs and passes; second is skipped -> Option B
Quick Check:
True condition runs assertion, false skips [OK]
Hint: Only assertions with true conditions run [OK]
Common Mistakes:
Assuming all assertions run regardless of condition
Confusing which assertions are skipped
Thinking skipped assertions cause failure
4. Identify the error in this JUnit 5 test using assumingThat:
int x = 3;
x = 4;
assumingThat(() -> x > 0, () -> assertEquals(3, x));
medium
A. The variable x is not final or effectively final
B. The assertion lambda is missing parentheses
C. The condition should be a boolean, not a lambda
D. The assertEquals method is used incorrectly
Solution
Step 1: Check the variable capture rules for lambdas
Local variables used in lambdas must be final or effectively final. Here, x is reassigned (x = 4), so it is not effectively final.
Step 2: Identify the error in the code
This causes a compilation error because lambdas cannot capture non-effectively final variables.
Final Answer:
The variable x is not final or effectively final -> Option A
Quick Check:
Lambda locals must be effectively final [OK]
Hint: Lambdas capture effectively final locals only [OK]
Common Mistakes:
Modifying local variables used in lambdas
Not declaring local variables as final when needed
Ignoring Java lambda capture rules
5. You want to write a test that only checks if a list is empty when the environment variable ENV equals "test". Which code snippet correctly uses assumingThat to achieve this?
hard
A. assumingThat(System.getenv("ENV").equals("test"), assertTrue(list.isEmpty()));
B. assumingThat(() -> System.getenv("ENV").equals("test"), assertTrue(list.isEmpty()));
C. assumingThat(System.getenv("ENV") == "test", () -> assertTrue(list.isEmpty()));
D. assumingThat(System.getenv("ENV").equals("test"), () -> assertTrue(list.isEmpty()));
Solution
Step 1: Check the condition type
The condition must be a boolean expression, so System.getenv("ENV").equals("test") is correct.
Step 2: Verify the assertion lambda
The assertion must be inside a lambda: () -> assertTrue(list.isEmpty()).
Step 3: Evaluate each option
A matches both requirements. B uses lambda for condition and passes assertion without lambda. C uses == for string comparison (wrong). D passes assertion without lambda.
Final Answer:
assumingThat(System.getenv("ENV").equals("test"), () -> assertTrue(list.isEmpty())); -> Option D