【问题标题】:How to get the method name that thrown the exception in Java如何在Java中获取引发异常的方法名称
【发布时间】:2012-09-18 21:27:39
【问题描述】:

我有一个在我的 TestNG 测试方法抛出异常后运行的方面。我想将测试方法名称添加到我的 aspectj 方法中。

对此有什么想法吗?请在下面找到我的代码示例:

方面:

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);
}

【问题讨论】:

    标签: java aop aspectj


    【解决方案1】:

    您需要将切入点类型从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());
        }
    }
    

    【讨论】:

    • 谢谢!!!将切入点类型从调用更改为执行就可以了。 (第二个 sn-p 没有被编译)。
    • 据我记得,我只是从我的编辑器复制并粘贴了第二个 sn-p,它编译得很好。你可以说得更详细点吗?您收到哪条错误消息?
    • 你得到的错误很可能是因为你需要指定完全限定的包如切入点testMethod(): execution(@org.testng.annotations.Test * *(..));跨度>
    • 你为什么要评论一个两年多前被接受的问题?顺便说一句,评论是错误的。在本机 AspectJ 语法中,完全限定名称是不必要的,因为您可以使用简单名称引用导入的类。只有在基于注解的@AspectJ 语法中这是必需的。
    【解决方案2】:

    你可以使用:

    thisJoinPoint.getSignature().getName()
    

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

    【讨论】:

    • 嗯...谢谢!但这给了我“assertEquels”方法。我需要测试方法(即 testScenarioOne)。
    猜你喜欢
    • 2021-12-04
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2020-12-26
    • 2019-08-04
    • 2013-08-13
    相关资源
    最近更新 更多