首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取getStackTrace()[2].getMethodName()的不同结果

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

Stack Overflow用户
提问于 2016-06-21 06:10:20
回答 4查看 3.6K关注 0票数 19

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

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

public static void method1() throws Exception {
    Utils.logTitle(2);
}

..。

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

问题是我在两台不同的机器上使用logTitle()得到了不同的结果。

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

2016-06-20 14:22:06 INFO  - ------------------------------------
2016-06-20 14:22:06 INFO  - method1
2016-06-20 14:22:06 INFO  - ------------------------------------

我们的dev unix box返回不同的结果:

2016-06-20 14:42:26 INFO  - ------------------------------------
2016-06-20 14:42:26 INFO  - logTitle
2016-06-20 14:42:26 INFO  - ------------------------------------

这在其他人的笔记本电脑上都能正常工作,但不是在开发unix机器上。我认为开发unix机器正在使用IBM的Java版本,而其他所有人都在使用Oracle的Java版本,但不确定这是否是罪魁祸首。

有什么想法吗?

EN

回答 4

Stack Overflow用户

发布于 2016-06-21 13:04:49

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

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

票数 5
EN

Stack Overflow用户

发布于 2016-06-30 02:16:29

我认为是特定的深度导致了问题,在您的场景中是2。

所以,与其写

String method = Thread.currentThread().getStackTrace()[2].getMethodName();

如果你写

StackTraceElement[] ste = Thread.currentThread().getStackTrace();
String method = null;
boolean doNext = false;
for (StackTraceElement s : ste) {
       if (doNext) {
          method = s.getMethodName();
          return;
       }
       doNext = s.getMethodName().equals("getStackTrace");
   }

它只适用于JDK 1.5+。

另一个选项如下:

String method = new Object(){}.getClass().getEnclosingMethod().getName();

或者更慢的选项是:

String method = new Exception().getStackTrace()[0].getMethodName();

因为这样每次都会创建一个异常的实例。

希望这能帮到你。

票数 1
EN

Stack Overflow用户

发布于 2016-06-23 15:42:46

通过向下搜索堆栈跟踪来执行Log4J finds the method name,直到找到必须传入的目标类名,然后读取方法名。

在您的代码中,您可以使用类似的技术-代替静态方法Utils,您可以在测试中创建一个实例,传入测试的类:

Utils utils = new Utils(MyTest.class);

然后在Utils.logTitle()方法中使用前面提到的搜索技术。

Utils.logTitle()将向前搜索新创建的Throwable的堆栈跟踪元素,直到找到具有所需目标类的第一个元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37932635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档