UnitTesting静态类

场景。 语言C#,使用VS2008unit testing框架进行unit testing

我有一个带静态构造函数的静态类和2个方法。 我编写了4个测试方法来测试整个类。 我的静态构造函数有一些重要的初始化。

现在,如果我串联运行所有4个unit testing用例,则仅在开始时调用静态构造函数。 在每个测试用例结束时,没有这样的事情

称为静态析构函数,因此构造函数中的状态信息也会被传递到下一个unit testing用例。 解决方法是什么?

最简单的解决方案是向静态类添加“重置”方法,该方法具有破坏它并重构它的等效行为。

您可能在这里使用静态类的正当理由。 但是,由于静力学不能很好地与unit testing相结合,我通常会寻找替代设计。

Type staticType = typeof(StaticClassName); ConstructorInfo ci = staticType.TypeInitializer; object[] parameters = new object[0]; ci.Invoke(null, parameters); 

来自http://colinmackay.scot/2007/06/16/unit-testing-a-static-class/

我会将初始化从静态构造函数移动到构造函数调用的方法。 通过将此方法设为内部 ,您可以从测试中调用此方法以重新初始化该类。

 public static class MyClass { public static MyClass() { initialize(); } internal static void initialize() { // Do initialization (and cleanup if necessary) } public static void Method1() {} public static void Method2() {} } 

要调用内部方法,您需要使用InternalsVisibleTo属性,如本博客中所述 。

您也可以将其设为私有,但之后您需要使用reflection来调用它。

但正如Andrew Shepherd所说,你还应该检查静态类是否是这个类的最佳设计。

在不知道该类的用法的情况下,仅仅使用该用法是有点棘手的,但不管怎么说还是试试看。 对我来说,上面的声音听起来不仅仅是一个测试问题。

静态类(就像单例一样)基本上是全局函数/变量的集合,这在oop中通常是一件坏事。 我会说尝试测试测试问题(尽管现在可能是最简单的)只能修复症状而不是问题。

如果你真的需要静态类,或者它看起来像是当时解决问题的最简单方法,我建议你去看一个concidere。

好吧,你没有指定你使用的是哪种语言,但如果有办法从测试文件中打开你的静态类,那么我会为它添加一个假的析构函数,你可以在每次测试后调用它。 这样,’析构函数’就会停留在测试类中,而不会停留在生产代码中。

您可以使用能够模拟静态类的Typemock的Isolator ,因此在每个测试中您都可以“定义”静态操作的方式。

但它不是免费产品。

听起来你正试图测试静态构造函数。 这似乎是一个坏主意。

考虑将初始化逻辑提取到单独的(非静态)类中。

为了便于讨论,假设您的静态类名为MySingleton,假设您使用Execute方法创建了一个名为MyInitializer的新类。 MySingleton的静态构造函数可以实例化MyInitializer并调用Execute,它执行所有初始化。

然后您的生产代码可以使用MySingleton,并忽略MyInitializer。 另一方面,您的测试可以忽略MySingleton,并为每个测试快乐地创建一个新的MyInitializer实例,每次都重新开始。

为了完整起见,如果需要重置静态类的非公共字段/变量,也可以通过reflection来重置。

 using System.Reflection; // or Mono.Reflection public static class MyClass{ private static string myString; } var newValue = "Potatoes"; var field = typeof(MyClass).GetField("myString", BindingFlags.Static | BindingFlags.NonPublic); field.SetValue(null, newValue); // the first null is because the class is static, the second is the new value