问题描述:

I have an aspect that runs after an exception is thrown from my TestNG test method. I would like to get the Test method name into my aspectj method.

Any thoughts on this? Please find my code sample below:

Aspect:

pointcut publicCall(): call(public * *(..));

after() throwing (AssertionError e): publicCall() {

logger.debug("Assertion Error thrown");

System.out.println("Threw an exception: " + e);

}

Test:

@Test

public void testScenarioOne(){

logger.debug("From Scenario One Test");

Assert.assertEquals(true, false);

}

网友答案:

You need to change your pointcut type from call to execution:

pointcut publicMethod(): execution(public * *(..));

after() throwing (AssertionError e): publicMethod() {
    System.out.println(thisJoinPointStaticPart.getSignature());
}

Edit: Maybe it would be even cleaner to specifically intercept @Test annotated methods:

import org.testng.annotations;

public aspect TestExceptionInterceptor {
    pointcut testMethod(): execution(@Test * *(..));

    after() throwing (AssertionError e): testMethod() {
        System.out.println(thisJoinPointStaticPart.getSignature());
    }
}
网友答案:

You can use:

thisJoinPoint.getSignature().getName()

although you will have to throw the exception directly from your test method. Assert.equals() is throwing the exception not your test method.

相关阅读:
Top