清理单元测试之间的私有静态变量

Posted

技术标签:

【中文标题】清理单元测试之间的私有静态变量【英文标题】:Clean up private static variables between unit tests 【发布时间】:2020-06-17 05:45:22 【问题描述】:

我有一个类似这样的类:

public class DiscoveryDocumentCache

    static DiscoveryDocumentCache()
    
        cache = new MemoryCache(discoveryDocumentCacheName);
    

    private static MemoryCache cache;

    // Other stuff...

我希望内存缓存是静态的,以便在类的所有实例之间共享。

它非常适合实际用例。我挣扎的地方是我的单元测试。因为cache 变量是静态的,所以它会累积放入其中的所有不同值。

我的用例没有“删除”选项。 (它们只是在缓存中过期。)

我已将此添加到我的 DiscoveryDocumentCache 课程中:

    public void __UnitTesting__CleanUpMemoryCacheBetweenTests()
    
        cache.Dispose();
        cache = new MemoryCache(discoveryDocumentCacheName);
    

但是添加一个只是为了方便单元测试的方法感觉很脏。

.NET Framework 有一些方法可以访问类的私有变量,如果您真的认为应该这样做的话。 在我的TearDown 单元测试方法中我可以做类似的事情来重置这个静态变量吗?

【问题讨论】:

就我个人而言,我会回避静态对象。也许注入某种缓存工厂,为您提供可能是也可能不是单例/静态/其他的缓存对象。然后你可以手动将你选择的缓存对象注入到你的可测试对象中。 【参考方案1】:

不确定您是否会认为这是一个答案,或者只是一个长评论。 :-)

您的测试运行良好,因为它们告诉您一些事情。他们说“这是对静态实例的错误使用。”

静态总是可疑的,尽管并不总是坏的。这里的坏处是您使用静态以一种随后无法控制的方式实现单例模式。也就是说,您的各个实例自己决定使用哪个缓存(单例),而不是被告知使用什么。

正如@Vaccano 所建议的,您最好使用某种依赖注入。将其翻译为“告诉每个对象使用什么缓存,而不是让他们自己弄清楚。”这是需要一些前期投资以避免以后麻烦的事情之一。

顺便说一句...更改应用程序以使其更易于测试并没有错。可测试性只是定义好的软件设计的另一个“功能”。诀窍是改变它以改进软件,通常是简化而不是复杂化。

【讨论】:

以上是关于清理单元测试之间的私有静态变量的主要内容,如果未能解决你的问题,请参考以下文章

如何测试在视图控制器单元测试中设置私有变量的方法?

在 Swift 中对私有变量进行单元测试

服务定位器模式下的单元测试

JUnit 测试私有变量? [复制]

基于Junit5+PowerMock的单元测试框架

备忘:Junit单元测试