Bird
Raised Fist0
JUnittesting~5 mins

TestWatcher for reporting in JUnit - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is TestWatcher in JUnit?
TestWatcher is a JUnit extension that allows you to add custom behavior when tests succeed, fail, or are skipped. It helps in reporting and logging test results.
Click to reveal answer
beginner
How do you use TestWatcher to log a message when a test fails?
Override the <code>failed(Throwable e, Description description)</code> method in a TestWatcher subclass to add custom logging or reporting when a test fails.
Click to reveal answer
beginner
Which method in TestWatcher is called when a test succeeds?
The succeeded(Description description) method is called when a test passes successfully.
Click to reveal answer
intermediate
Why use TestWatcher instead of @After or @Before methods for reporting?
TestWatcher provides hooks specifically for test result events (success, failure, skip), making it easier and cleaner to add reporting logic tied directly to test outcomes.
Click to reveal answer
intermediate
Show a simple example of a TestWatcher that prints test start and finish messages.
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;

public class MyTestWatcher extends TestWatcher {
  @Override
  protected void starting(Description description) {
    System.out.println("Starting: " + description.getMethodName());
  }
  @Override
  protected void finished(Description description) {
    System.out.println("Finished: " + description.getMethodName());
  }
}
Click to reveal answer
Which TestWatcher method is called when a test fails?
Asucceeded(Description description)
Bfinished(Description description)
Cstarting(Description description)
Dfailed(Throwable e, Description description)
What is the main purpose of using TestWatcher in JUnit?
ATo add custom behavior on test lifecycle events
BTo write test assertions
CTo configure test timeouts
DTo create test data
Which method would you override to log when a test starts?
Astarting(Description description)
Bfailed(Throwable e, Description description)
Csucceeded(Description description)
Dfinished(Description description)
Can TestWatcher be used to skip tests?
AOnly for parameterized tests
BNo, it only observes test events
COnly if combined with @Ignore
DYes, it can skip tests
Which JUnit version introduced TestWatcher as an extension?
AJUnit 5
BJUnit 3
CJUnit 4
DJUnit 6
Explain how TestWatcher helps improve test reporting in JUnit.
Think about how you can react to test outcomes automatically.
You got /4 concepts.
    Describe how to implement a TestWatcher that logs test start and failure events.
    Focus on which methods to override and what to log.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the primary purpose of using TestWatcher in JUnit tests?
      easy
      A. To react to test lifecycle events like start, success, failure, and finish
      B. To write assertions inside test methods
      C. To create mock objects for testing
      D. To configure database connections before tests

      Solution

      1. Step 1: Understand TestWatcher role

        TestWatcher is a JUnit class designed to listen to test lifecycle events such as when a test starts, succeeds, fails, or finishes.
      2. Step 2: Differentiate from other test tasks

        Writing assertions, mocking, or configuring databases are separate concerns and not the main purpose of TestWatcher.
      3. Final Answer:

        To react to test lifecycle events like start, success, failure, and finish -> Option A
      4. Quick Check:

        TestWatcher = react to test events [OK]
      Hint: TestWatcher listens to test events, not assertions or mocks [OK]
      Common Mistakes:
      • Confusing TestWatcher with assertion writing
      • Thinking TestWatcher creates mocks
      • Assuming TestWatcher manages test setup like DB connections
      2. Which method signature correctly overrides the TestWatcher method that runs when a test fails?
      easy
      A. public void failed(ExtensionContext context, Throwable cause)
      B. protected void failed(Throwable e, Description description)
      C. void failed(Description description, Throwable e)
      D. public void testFailed(ExtensionContext context, Throwable cause)

      Solution

      1. Step 1: Recall TestWatcher method signature

        The failed method in TestWatcher is public void failed(ExtensionContext context, Throwable cause).
      2. Step 2: Check method modifiers and parameter order

        It must be public, return void, and parameters are ExtensionContext first, then Throwable.
      3. Final Answer:

        public void failed(ExtensionContext context, Throwable cause) -> Option A
      4. Quick Check:

        failed method = public void failed(ExtensionContext, Throwable) [OK]
      Hint: Check parameter order and access modifier for overrides [OK]
      Common Mistakes:
      • Swapping parameter order
      • Using protected instead of public
      • Missing return type or wrong method name
      3. Given the following TestWatcher subclass, what will be printed if the test exampleTest fails?
      class MyWatcher extends TestWatcher {
        @Override
        public void failed(ExtensionContext context, Throwable cause) {
          context.getTestMethod().ifPresent(method -> System.out.println(method.getName() + " failed"));
        }
      }
      
      @Test
      @ExtendWith(MyWatcher.class)
      void exampleTest() {
        assertEquals(1, 2);
      }
      medium
      A. No output printed
      B. failed
      C. exampleTest
      D. exampleTest failed

      Solution

      1. Step 1: Understand what failed() prints

        The overridden failed method prints the test method name plus " failed".
      2. Step 2: Identify test method name on failure

        The test method is named exampleTest, so the output will be "exampleTest failed".
      3. Final Answer:

        exampleTest failed -> Option D
      4. Quick Check:

        Print = methodName + " failed" = exampleTest failed [OK]
      Hint: Print uses description.getMethodName() on failure [OK]
      Common Mistakes:
      • Assuming no output on failure
      • Printing only 'failed' without method name
      • Confusing method name with test class name
      4. Identify the error in this TestWatcher subclass that aims to log test success:
      class SuccessWatcher extends TestWatcher {
        @Override
        public void succeeded(Description description) {
          System.out.println(description.getDisplayName() + " succeeded");
        }
      }
      medium
      A. Method signature is incorrect; it should include Throwable parameter
      B. Method signature is incorrect; it should be public void succeeded(ExtensionContext context)
      C. Method should be protected, not public
      D. Method signature is incorrect; it should be public void succeeded(Description description, Throwable e)

      Solution

      1. Step 1: Check JUnit version and method signature

        In JUnit 5, TestWatcher methods use ExtensionContext parameter, not Description.
      2. Step 2: Identify correct succeeded() signature

        The correct override is public void succeeded(ExtensionContext context) in JUnit 5.
      3. Final Answer:

        Method signature is incorrect; it should be public void succeeded(ExtensionContext context) -> Option B
      4. Quick Check:

        JUnit 5 TestWatcher uses ExtensionContext parameter [OK]
      Hint: JUnit 5 TestWatcher methods use ExtensionContext, not Description [OK]
      Common Mistakes:
      • Using JUnit 4 signatures in JUnit 5
      • Wrong parameter types or order
      • Confusing access modifiers
      5. You want to create a custom TestWatcher that logs test start and failure events, but only for tests whose names start with "critical". Which approach correctly implements this behavior in JUnit 5?
      hard
      A. Override starting(Description description) and failed(Throwable e, Description description), check description.getMethodName() starts with "critical" before logging
      B. Override beforeTestExecution(ExtensionContext context) and afterTestExecution(ExtensionContext context), check context.getTestMethod().getName() starts with "critical" before logging
      C. Override starting(ExtensionContext context) and failed(ExtensionContext context, Throwable cause), check context.getDisplayName() starts with "critical" before logging
      D. Override testStarted(Description description) and testFailure(Failure failure), check failure.getDescription().getMethodName() starts with "critical" before logging

      Solution

      1. Step 1: Identify correct JUnit 5 TestWatcher methods

        In JUnit 5, TestWatcher methods to override are starting(ExtensionContext) and failed(ExtensionContext, Throwable).
      2. Step 2: Filter test names using context.getDisplayName()

        Use context.getDisplayName() to get the test name and check if it starts with "critical" before logging.
      3. Final Answer:

        Override starting(ExtensionContext context) and failed(ExtensionContext context, Throwable cause), check context.getDisplayName() starts with "critical" before logging -> Option C
      4. Quick Check:

        JUnit 5 TestWatcher + ExtensionContext + name check = Override starting(ExtensionContext context) and failed(ExtensionContext context, Throwable cause), check context.getDisplayName() starts with "critical" before logging [OK]
      Hint: Use ExtensionContext methods and check displayName for filtering [OK]
      Common Mistakes:
      • Using JUnit 4 method signatures in JUnit 5
      • Checking wrong parameter types
      • Using lifecycle methods not related to TestWatcher
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard