user11481216
user11481216

Reputation:

How to access test method annotations from a TestExecutionListener

I'm trying to port Test Management For Jira JUnit Integration to JUnit5. This module generates a JSON report of the test run and associates the results with Jira tickets by using annotations on the test methods, example.

From the TestExecutionListener I'm not sure what the best approach to retrieve the TestCase annotation is.

I looked at Reflection using the TestIdentifier.getSource and doing manipulations to rebuild the method signature and extracting the annotation from there but the approach felt clumsy.

I came across this post Allow extensions to register TestExecutionListeners which proposed the following:

Proposal: Have your extension publish the WebDriver bean's session id, e.g.

String sessionId = ...;
extensionContext.publishReportEntry("webDriverSessionId", sessionId)

In your TestExecutionListener, implement reportingEntryPublished and store it in a Map with the TestIdentifier as a key. In executionFinished report the test outcome along with the value from this Map.

This approach looks promising but I want to make sure there isn't another way that doesn't require both an extension and a test execution listener. Is there a way to retrieve test method annotation information directly in the TestExecutionListener?

Upvotes: 3

Views: 2923

Answers (2)

noriks
noriks

Reputation: 81

Seems like you can't get test annotation from TestExecutionListener but instead you can implement TestWatcher or e.g AfterEachCallback and get custom annotation value like that:

import org.junit.jupiter.api.extension.AfterEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.TestWatcher;

public class MyExtention implements TestWatcher, AfterEachCallback {


    @Override public void testSuccessful(ExtensionContext context) {
        if (context.getElement().isPresent() && context.getElement().get().isAnnotationPresent(MyCustomAnnotation.class)) {
            int val = context.getElement().get().getAnnotation(MyCustomAnnotation.class).value();
            // Report on success
        }
    }

    @Override public void afterEach(ExtensionContext context) throws Exception {
        if (context.getElement().isPresent() && context.getElement().get().isAnnotationPresent(MyCustomAnnotation.class)) {
            int val = context.getElement().get().getAnnotation(MyCustomAnnotation.class).value();
            // Report each
        }
    }
}

Upvotes: 1

Keyholder
Keyholder

Reputation: 29

@Alex, the following might be used inside the listener... ((MethodSource) testIdentifier.source).javaMethod.getAnnotation(TestCase.class)

Upvotes: 0

Related Questions