当前位置: 首页 > 面试题库 >

单元测试中的静态类/方法/属性,是否停止

曹成双
2023-03-14
问题内容

考虑到没有引入不能再次测试的包装器的方法,则不能在单元测试开发环境中使用静态的类/方法/属性?

另一种情况是,在单元测试目标中使用静态成员时,无法模拟静态成员。因此,在测试单元测试目标时,您必须测试静态成员。当静态成员执行计算时,您想隔离它。


问题答案:

测试静态方法与测试任何其他方法没有什么不同。将静态方法作为 依赖关系 在另一个经过测试的模块中会引发问题(如前所述-
您无法使用免费工具对其进行模拟/存根)。但是,如果静态方法本身已经过单元测试,则可以简单地将其视为有效的可靠组件

总体而言,在以下情况下,使用静态方法没有任何问题(例如,不会破坏单元测试/ TDD):

  • 这是简单的输入输出方法(各种 “给定的计算”
  • 它是 可靠的 ,也就是说我们已经对它进行了测试,或者来自您认为可靠的第三方来源(例如,Math.Floor可能被认为是可靠的-使用它不应发出 注意 ,这是静态的!” 警告;您可能会假设微软做到了)

静态方法何时会引起问题,应避免使用?基本上,只有当他们与 互动或 做一些您无法控制 (或模拟)的 事情时

  • 各种文件系统,数据库,网络依赖项
  • 从内部调用的其他(可能是更复杂的)静态方法
  • 您的模拟框架无法正常处理的几乎所有内容

编辑: 就当静态方法两个例子 使得单元测试硬盘

1个

public int ExtractSumFromReport(string reportPath)
{
     var reportFile = File.ReadAllText(reportPath);
     // ...
}

你如何处理File.ReadAllText?很显然,这将进入文件系统以检索文件内容,这在单元测试时是主要的禁止。这是具有外部依赖关系的静态方法的示例。为了避免这种情况,通常可以围绕文件系统api创建包装器,或者只是将其作为依赖项/委托注入。

2

public void SaveUser(User user)
{
    var session = SessionFactory.CreateSession();
    // ...
}

那这个呢?会话 是非平凡的
依赖关系。当然,它可能是ISession,但是如何强制SessionFactory返回模拟?我们不能。而且我们也无法创建 易于确定的 会话对象。

在上述情况下,最好完全避免使用静态方法。



 类似资料:
  • 问题内容: 阅读并学习单元测试,尝试理解下面的文章,该文章解释了静态函数调用的困难。 我不清楚这个问题。我一直认为静态函数是在类中舍入实用函数的一种好方法。例如,我经常使用静态函数调用进行初始化,即: //阅读这篇文章后,我现在的目标是… 但是,我为此课程编写的几十个测试是相同的。我什么都没改变,他们仍然都过去了。难道我做错了什么? 该帖子的作者指出: 静态方法的基本问题是它们是过程代码。 我不知

  • 我需要junit测试一段代码,但它从不同类调用的GsonConverter是静态方法,我无法更改。我不知道如何进行,因为我不能嘲笑它,因为它是静态的。 下面是带有静态方法的类

  • 我在一个外部包中有@Entity类,它也有静态元模型。在我的应用程序的服务类中,我使用这些元模型和EntityManager/criteria builder/criteria query来检索我的数据。这在运行应用程序时工作良好。然而,当运行单元测试时,我的元模型和它们的属性总是空的。 密码 我的应用程序服务类中的使用情况。。。 “RepositoryQueryBuilder”类只是一个实用程序

  • 我正在为我的一个应用程序编写单元测试,作为一个很好的实践,我试图使我的类中的所有方法尽可能私有,所以我最终可能会使用大部分私有方法的类,很少使用公共方法,有时还会调用一些静态方法(我的其他类或一些文本,等等) 我想知道如何测试我试图只依赖Mockito和JUnit的所有类,因为Robolectric和Powermockito似乎扩展了单元测试中应该做什么的边界。我应该忽略所有私有和静态方法,以及偶

  • 本文向大家介绍PowerShell中调用.NET对象的静态方法、静态属性和类方法、类属性例子,包括了PowerShell中调用.NET对象的静态方法、静态属性和类方法、类属性例子的使用技巧和注意事项,需要的朋友参考一下 本文介绍在PowerShell中如何使用.NET对象,PowerShell内在支持大量的.NET对象。 调用类的静态方法 用中括号把类的名称括起来,然后输入两个冒号,然后再输入方法

  • 我们可以把一个方法赋值给类的函数本身,而不是赋给它的 "prototype"。这样的方法被称为 静态的(static)。 在一个类中,它们以 static 关键字开头,如下所示: class User { static staticMethod() { alert(this === User); } } User.staticMethod(); // true 这实际上跟直接将其