如何在Java中获取抛出异常的方法名

9

我有一个方面,在我的TestNG测试方法抛出异常后运行。我想在我的AspectJ方法中获取Test方法的名称。

对此有什么想法吗?请查看下面的代码示例:

方面:

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

after() throwing (AssertionError e): publicCall() {
    logger.debug("Assertion Error thrown");
    System.out.println("Threw an exception: " + e);
}

测试:

@Test

public void testScenarioOne(){
    logger.debug("From Scenario One Test");
    Assert.assertEquals(true, false);
}
2个回答

6

您需要将切入点类型从 call 更改为 execution

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

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

编辑:也许更好的做法是特别拦截带有@Test注释的方法:

import org.testng.annotations;

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

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

谢谢!!! 将切入点类型从call更改为execution就解决了问题。(第二个片段没有被编译)。 - rookie007r
据我所记,我只是从我的编辑器中复制并粘贴了第二个代码片段,它在那里编译得很好。你能更具体一些吗?你收到了哪个错误消息? - kriegaex
你得到的错误很可能是因为你需要指定完全限定的包,例如切入点testMethod(): execution(@org.testng.annotations.Test * *(..)); - Julian
你为什么要评论一个已经被接受超过两年的问题呢?顺便说一下,这个评论是错误的。在本地AspectJ语法中,完全限定名称是不必要的,因为你可以用简单的名称引用导入的类。只有在基于注释的@AspectJ语法中才需要这样做。 - kriegaex

3

您可以使用:

thisJoinPoint.getSignature().getName()

虽然你必须直接从测试方法中抛出异常。Assert.equals() 抛出异常而不是你的测试方法。

1
好的...谢谢!但是那给了我"assertEquels"方法。我需要测试方法(即testScenarioOne)。 - rookie007r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接