首页 / 知识
关于单元测试:用Java模拟静态块
2023-04-15 06:09:00

Mocking Static Blocks in Java我对Java的座右铭是"仅仅因为Java具有静态块,并不意味着您应该使用它们。"除了笑话,Java中还有许多使测试成为噩梦的技巧。我最讨厌的两个是匿名类和静态块。我们有很多使用静态块的遗留代码,这些是我们编写单元测试时最讨厌的点之一。我们的目标是能够以最小的代码更改为依赖于此静态初始化的类编写单元测试。
到目前为止,我对同事的建议是将静态块的主体移到私有静态方法中,并将其称为
将更改为
这样我们就可以在JUnit中执行以下操作。
但是,该解决方案也有其自身的问题。您不能在同一JVM上运行 您将如何完成此任务?还是您认为任何更好的,非基于JMockit的解决方案都更清洁? PowerMock是另一个扩展EasyMock和Mockito的模拟框架。使用PowerMock,您可以轻松地从类(例如静态初始化程序)中删除不需要的行为。在您的示例中,您只需将以下注释添加到您的JUnit测试用例中:
PowerMock不使用Java代理,因此不需要修改JVM启动参数。您只需添加jar文件和上面的注释。
这将涉及更多的"高级" JMockit。事实证明,您可以通过创建
我们不妨按原样保留
实际上,这将使我们无法在现有类中进行任何更改。
有时,我会在代码所依赖的类中找到静态初始化器。 如果无法重构代码,则可以使用PowerMock的
阅读有关抑制不必要行为的更多信息。 免责声明:PowerMock是我的两个同事开发的一个开源项目。
在我看来,您正在对待一种症状:糟糕的设计依赖于静态初始化。也许某些重构才是真正的解决方案。听起来您已经对 至于模拟,我使用EasyMock,但是遇到了同样的问题。遗留代码中静态初始化程序的副作用使测试变得困难。我们的答案是重构静态初始化程序。 遇到此问题时,我通常会执行与您描述的相同的操作,除了将静态方法设置为受保护的方法之外,以便可以手动调用它。最重要的是,我确保可以多次调用该方法而不会出现问题(否则就测试而言,它并不比静态初始化程序好)。 这工作得相当好,我可以实际测试静态初始化方法是否达到了我期望/想要的方式。有时,拥有一些静态初始化代码是最容易的,而构建一个过于复杂的系统来替换它是不值得的。 使用这种机制时,请确保记录该受保护的方法仅出于测试目的而公开,并希望其他开发人员不会使用它。当然,这可能不是一个可行的解决方案,例如,如果类的接口在外部可见(作为其他团队的某种子组件,或者作为公共框架)。但是,这是解决该问题的简单方法,并且不需要第三方库来设置(我喜欢)。 您可以用Groovy编写测试代码,并使用元编程轻松地模拟静态方法。
如果您不能使用Groovy,则确实需要重构代码(也许要注入类似Initializator的东西)。 亲切的问候 我对Mock框架不是很了解,所以如果我错了,请更正我,但是您可能无法拥有两个不同的Mock对象来解决您提到的情况吗?如
和
然后,您可以在不同的测试用例中使用它们
和
分别。 我想您真的想要某种工厂而不是静态初始值设定项。 单例和抽象工厂的某种混合可能能够为您提供与今天相同的功能,并且具有良好的可测试性,但是这会增加很多样板代码,因此尝试重构可能会更好。完全解决静态问题,或者至少可以解决一些不太复杂的问题。 尽管看不到您的代码,很难说是否有可能。
并不是一个真正的答案,只是在想-没有任何方法可以"撤消"对
如果存在这样的方法,则可以在类的 不过这只是预感,因此我可能会缺少一些东西。 |
最新内容
相关内容
linux模拟命令ls?
linux模拟命令ls?,系统,地址,工作,命令,时间,基础,标准,信息,文件,目录,LS(LINUX中ls命令)详细资料大全ls命令是linux下最常用的命令之一,ls跟dlinux在线模拟器命令?
linux在线模拟器命令?,系统,设备,管理,命令,软件,数据,在线,网络,环境,盘中,linux必学的60个命令_linux必学的60个命令怎么读起来简单安装和登linux命令模拟软件?
linux命令模拟软件?,软件,系统,地址,平台,电脑,环境,网上,工具,名字,名称,windows环境下的linux模拟软件1、首先需要打开电脑里的VirualBox软Python的Unittest单元测试使用详解
Python的Unittest单元测试使用详解,地址,位置,网站,信息,分析,工具,培训,系统,例子,目标,PytheM是一个Python渗透测试框架。它只能在osnGNU/Lpython的单元测试框架
python的单元测试框架,代码,生态,信息,标准,测试,分析,工具,环境,条款,活跃,1、AutotestAutotest是Google、Redhat、IBM公司联合开发的分布式Python单元测试经验总结
Python单元测试经验总结,名字,项目,报告,工具,代码,培训,测试,文件,覆盖率,都会,python写单元大多数都会用到unittest和mock,测试代码覆盖率都python单元测试框架unittest
python单元测试框架unittest,工作,概念,培训,名字,预期,代码,人员,测试,元器件,框架,unittest是python单元测试框架,又叫做PyUnit。之所以称为Python的Unittest单元测试使用详解
Python的Unittest单元测试使用详解,地址,位置,网站,信息,分析,工具,培训,系统,例子,目标,PytheM是一个Python渗透测试框架。它只能在osnGNU/LPython的单元测试---Pyunit介绍
Python的单元测试---Pyunit介绍,代码,标准,管理,网上,预期,工作,培训,测试,模块,结果,之前我做过一点python脚本的编写工作,但是编写过程中的python标准库中自带的单元测试框架
python标准库中自带的单元测试框架,标准,培训,框架,python单元测试中的函数整理
python单元测试中的函数整理,培训,环境,测试,方法,函数,单元,条件,实例,里面,以上,python单元测试中的函数整理1、setUp准备环境。执行每个测C ++单元测试旧版代码:如何处理#inc
C ++单元测试旧版代码:如何处理#include?,C ++单元测试旧版代码:如何处理#include?,模块,旧版,指令,单元测试,C++ Unit Testing Legacy C