获取getStackTrace()[2] .getMethodName()的不同结果

Gre*_*reg 19 java testng

出于日志记录的目的,我创建了一个方法logTitle(),它打印出TestNG测试的调用方法名称.示例代码如下.

@Test
public void test1() throws Exception {
    method1();
}

public static void method1() throws Exception {
    Utils.logTitle(2);
}
Run Code Online (Sandbox Code Playgroud)

...

public static void logTitle(Integer level) throws Exception {

    // Gets calling method name
    String method = Thread.currentThread().getStackTrace()[2].getMethodName();
    // This would get current method name
    switch (level) {
    case 1:
        logger.info("=======================================================");
        logger.info(method);
        logger.info("=======================================================");
        break;
    case 2:
        logger.info("------------------------------------");
        logger.info(method);
        logger.info("------------------------------------");
        break;
    case 3:
        logger.info("---------------------");
        logger.info(method);
        logger.info("---------------------");
        break;
    case 4:
        logger.info("--------- " + method + " ------------");
        break;
    default:
        logger.info(method);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我在两台不同的机器上获得了不同的logTitle()结果.

每个人的笔记本电脑都正确返回:

2016-06-20 14:22:06 INFO  - ------------------------------------
2016-06-20 14:22:06 INFO  - method1
2016-06-20 14:22:06 INFO  - ------------------------------------
Run Code Online (Sandbox Code Playgroud)

我们的dev unix框以不同的方式返回:

2016-06-20 14:42:26 INFO  - ------------------------------------
2016-06-20 14:42:26 INFO  - logTitle
2016-06-20 14:42:26 INFO  - ------------------------------------
Run Code Online (Sandbox Code Playgroud)

这适用于其他人的笔记本电脑,而不是dev unix盒子.我认为dev unix框使用的是IBM的Java版本,而其他所有人都在使用Oracle的Java版本,但不确定这是否是罪魁祸首.

有任何想法吗?

juh*_*err 5

获得测试方法名称的更简单方法是使用 a@BeforeMethod并注入Method. 请参阅此处的TestNG 文档。

只需将名称存储在某处并在您的日志中使用它(为什么不在一个@AfterMethod?)


Ada*_*kiy 5

Javadoc

在某些情况下,某些虚拟机可能会从堆栈跟踪中省略一个或多个堆栈帧。在极端情况下,允许没有与此 throwable 有关的堆栈跟踪信息的虚拟机从此方法返回零长度数组。

因此,唯一有保证的方法是使用方面,或使用其他自定义方式收集堆栈跟踪。但是您可以将此方法与回退结合使用以某种方式获取当前方法的名称(例如您的logTitle方法将被内联)。例如,它可以在这里找到。同样,不能保证,但有更好的机会。