Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 单元测试缓存管理器_Unit Testing_Testing - Fatal编程技术网

Unit testing 单元测试缓存管理器

Unit testing 单元测试缓存管理器,unit-testing,testing,Unit Testing,Testing,我有一个CacheManager类,它保存了一个包含各种缓存数据的静态字典。然而,由于这个字典是静态的,它会被来自其他单元测试的数据填满。这使我无法进行单元测试,无论CacheManager在init上是否为空,并且违反了单元测试的原则 你知道如何为此创建一个合适的单元测试吗 代码 public class CacheManager { private static readonly Dictionary<ICacheKey, ListCacheItem> cacheEntri

我有一个CacheManager类,它保存了一个包含各种缓存数据的静态字典。然而,由于这个字典是静态的,它会被来自其他单元测试的数据填满。这使我无法进行单元测试,无论CacheManager在init上是否为空,并且违反了单元测试的原则

你知道如何为此创建一个合适的单元测试吗

代码

public class CacheManager
{
   private static readonly Dictionary<ICacheKey, ListCacheItem> cacheEntries =
       new Dictionary<ICacheKey, ListCacheItem>();

   public static Dictionary<ICacheKey, ListCacheItem> CacheEntries
   {
       get
       {
           lock (cacheEntries)
           {
               return cacheEntries;
           }
       }
   }
公共类缓存管理器
{
专用静态只读字典缓存项=
新字典();
公共静态字典缓存项
{
得到
{
锁定(缓存条目)
{
返回缓存条目;
}
}
}

一般来说,从测试的角度来看,这不是一个好主意。通过使
CacheManager
的成员保持静态,您将永远无法以这样的方式将其隔离开来,从而使单元测试变得很好


也许更好的解决方案是。要做到这一点,请去掉
CacheManager
成员上的静态修饰符。这样,您的应用程序中就可以有一个供其他所有人使用的静态实例。因此,在单元测试中,您可以创建一个新的类实例,该类可以单独测试,但仍然具有所需的功能简洁的回答:你不能做得很好。单元测试和静态不能很好地结合在一起,你(几乎)总是会遇到你提到的问题

更详细的回答:最好的解决方案是重构代码。即使您需要单例行为,您也有几个选项(例如依赖项注入)。David的建议当然也是一个选项,至少可以让您测试缓存,但当您要测试系统的其余部分时,您可能仍然会遇到问题

如果出于某种原因,您希望坚持当前的设计,您仍然可以有一些(不必要的)解决方法。一些示例:

最简单的方法可能是添加“cleanCache”方法。在某些情况下,它甚至可能对系统的其余部分有用,并且您的每个测试也可以将其作为第一步(在“setup/beforeTest或类似方法”中)

您还可以利用可见性,让测试进行代码其余部分不允许的清理


只要您不并行运行测试,这些黑客可能会起作用。

这有什么好处?单例程序不也会在测试之间保留值吗?正确,单例程序会。但是您可以实例化
CacheManager
本身并单独测试其成员。然后在其他测试中,例如,您可以确保应用程序的其他部分正在使用相同的Singleton实例。因此,实际上,您的解决方案是创建一个新的Singleton类,其中包含CacheManager实例作为其成员之一?在CacheManager中,您可以使用静态方法getInstance()这将返回您的Singleton实例。Singleton的全部目的是只实例化一个对象,因此我不知道如何在不影响其他单元测试的情况下实例化CacheManager。不过,您给了我一个更好的主意(请参见前面的注释),谢谢。