java - 如何最好地对期望设置 ThrreadLocal 变量的类使用 junit 测试?
问题描述
我发现一个非常古老的问题问同样的事情(使用 Thread Local 的应用程序的单元测试部分)但它只有 3 个答案,尽管它的年龄和那些推荐的不同框架。junit5(甚至junit4)是否提供更好的解决方案?
重申问题,如果一个类期望只从应用程序中启动的线程中调用,并且期望已建立 threadlocals
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() 方法和junits 的@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;
}
推荐阅读
- spring-boot - 类路径资源【org/apache/ibatis/plugin/Interceptor.class】无法打开,因为它不存在
- firebase - Firestore 移至 Firebase 函数中的时间戳
- r - R给定数据框列表,如何向数据框中的所有行添加新列
- html - 悬停项目在移动设备上始终处于活动状态
- regex - java.util.regex.PatternSyntaxException:字符串 +91 的悬挂元字符“+”
- java - 如何使用过滤器来处理 servlet 中抛出的异常
- javascript - 我想创建自己的标签,例如
, - ms-access - Microsoft Access - 登录
- audio - 带有音频和视频过滤器的 ffplay / ffmpeg
- java - 在java中添加三个不同的char作为java变量并获取一个数字