如何解决如何最好地将 junit 测试用于期望已设置 ThrreadLocal 变量的类?
我发现了一个非常古老的问题,问了同样的问题 (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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。