繁体   English   中英

getClass()。getName()返回null

[英]getClass().getName() returns null

我正在使用testNG为测试作者提供一个“框架”,以加快测试的开发。 为了实现这一点,我有一个抽象的Test类。 所有书面测试均源自该Test类。 这些测试可以由testNG并行运行。 现在,我注意到有时在@BeforeClass方法中,当并行执行时,我简单的'getClass()。getName()'方法将返回null。

private static ThreadLocal<String> className;

@BeforeClass
public void init(){
        initName();
        className.set(getClass().getName());            
        log("Starting test " + className.get());
}

private synchronized void initName(){
    if(className == null){
        className = new ThreadLocal<>();
    }
}

当我并行运行一堆测试时,得到以下输出:

...
Starting test com.mycompany.testsets.LocalTestSet$IntegrationTest3
Starting test null
Starting test com.mycompany.testsets.LocalTestSet$IntegrationTest1
...

一些说明:
Threadlocal ClassName必须为静态(稍后在@Dataprovider中使用其值)
由于它是随机发生的,并且可以在任何测试中发生,因此我认为这是线程安全问题,但是我看不到如何使'getClass()。getName()'更加线程安全。

谢谢您的帮助

您似乎有种族问题。 如果一个线程在另一个线程调用log之前调用了initName ,则新ThreadLocal将没有值,即。 将返回null

您在这里没有线程安全,因此无法保护initName null检查。

跳过initName的延迟初始化! 它不是线程安全的。

而是直接初始化ThreadLocal字段(并注意final ):

private static final ThreadLocal<String> className = new ThreadLocal<>();

(顺便说一句:为什么您需要一个ThreadLocal来保存当前类的名称?您只需每次调用getClass().getName()即可轻松获得它)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM