首页 > 解决方案 > 如何最好地对期望设置 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,但现在这样做了。

标签: javajunitjunit4junit5thread-local-storage

解决方案


我让这件事变得更加困难(或者至少到目前为止它看起来是这样的:-)。我只是将 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;
    }

推荐阅读