问题描述
我发现了一个非常古老的问题,问了同样的问题 (Unit testing parts of the application that use Thread Local),但尽管它的年龄和那些推荐的不同框架,它只有 3 个答案。 junit5(甚至junit4)是否提供了更好的解决方案?
重申这个问题,如果一个类只希望从应用程序中启动的线程调用,并且希望线程局部变量已经建立
class workers implments runnable {
...
public static ThreadLocal<String> myString = new ThreadLocal<String>...
...
}
class foo {
public static calledByJunitAndApp {
..myString.get()..
}
}
那么,为一个从未通过可运行但调用一些期望它的类的junit测试建立预期环境的最简洁和最简单的方法是什么? “最简单”的部分是关键,因为这是用于 junit 测试,其中他们调用的类以前没有访问 ThreadLocals,但现在这样做了。
解决方法
我让这件事变得比实际情况要困难得多(或者至少到目前为止看起来是这样:-)。我只是将 threadLocals 的声明(没有初始化)移动到一个公共全局类中,并在那里添加了一个 setup() 方法来进行初始化。 run() 方法和junit 的@before 方法都调用它。在看到大多数(如果不是每个)包含使用 ThreadLoclas 的可运行的示例后,也在那里声明和初始化它们,你会认为你也应该这样做。
//in the globals packkage
class globals {
...
public static ThreadLocal<String> myString;
public static setupTLs() {
myString = new ThreadLocal<String>();
}
//in the main app
import globals;
class workers implments runnable {
...
void run() {
globals.setupTLs();
}
class foo {
public static calledByJunitAndApp {
..myString.get()..
}
}
//in junit tests
import globals;
@before
void initializer() {
globals.setupTLs;
}