微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何最好地将 junit 测试用于期望已设置 ThrreadLocal 变量的类?

如何解决如何最好地将 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 举报,一经查实,本站将立刻删除。