Powermock 未通过测试
Powermock fails tests
我想用 Powermock运行nner 替换我的 JUnitRunner(以便进一步使用简单 Mockito 没有的 Powermock 功能)。
所以我添加了依赖项,在我的测试 class 中替换了 运行ner,并添加了 @PrepareForTest 注释,并且在编写任何进一步的测试代码之前,运行 我现有的测试以验证它们。
在大约 25 项测试中,有 5 或 6 项由于明显的功能原因而失败(我的意思是它们失败是因为 运行 代码中的实际失败,而不是某些基础结构错误)。
在正常状态下,这些测试是 100% 一致且不不稳定的。
这样的更改怎么会在完全工作的测试中失败?
为了帮助您诊断问题,您必须 post 一些失败的测试。
但老实说;你走错了兔子洞!
PowerMock(ito) 提供的与 Mockito 相比仅有的两个特性是:它可以模拟静态调用和对 new() 的调用。
您为这些功能支付的奖励:
- Mockito 的后级版本是强加给你的。 Mockito 本身现在是 2.8 版本;但是 PowerMockito 不能与比 Mockito 2.0.40 beta 更新的任何东西一起工作(而且 Mockito 团队几乎 每周 发布一次!)
- PowerMock 依赖于字节码操作。意思是:模拟静态调用会改变你的 production 代码。是的,所有这些都有效。但是只要看看这里所有标记为 PowerMock 的 questions——您可能会注意到一个模式。有很多关于模糊问题的问题,这些问题通常没有答案。一旦您开始使用 Oracle 以外的其他 JVM ... "fun" 是有保证的。 (相信我,去过那里!)
- PowerMock 不能很好地与其他需要字节码操作的框架一起使用,例如用于覆盖测量的 EcLemma。
除此之外:您需要 使用 PowerMock 并非突然出现。它基于您创建了 hard-to-test 代码这一事实。
因此我的建议是:学习如何编写易于测试的代码(例如通过观看这些 videos)。那里的核心方面:易于测试的代码很可能也是 更好 设计的。 static导致紧耦合,破坏了面向对象的本质——多态性。
所以,我的建议是:升级到最新版本的 Mockito;而不是花时间学习 A) 在过去造成很多痛苦的框架 B) 鼓励您不要修复损坏的设计,而是解决它们。
2% 的个人经验:当我们开始单元测试时,我们的团队正在使用 PowerMock。我们花了无数个小时来研究其中一些奇怪的 PowerMock 问题。最后:我们学会了如何编写更好的生产代码;我们学习了如何使用 Mockito 正确地测试它们。我们不再使用 PowerMock;我们从未对那个决定感到后悔。
虽然这是一个旧的post,但我最近有类似的经历并且遇到了 PowerMock 和 Mockito 之间的依赖矩阵。
当我们在 Springboot 项目中同时使用 Mockito 和 PowerMock 依赖项时,我们需要注意我们使用的 PowerMock 和 Mockito 的版本。
这是相同的 dependency matrix。
通常Spring boot starter test 带有一个版本的Mockito。在我的例子中,我不得不从 starter 中排除 Mockito 依赖项,并添加与最新的 PowerMock 版本配合良好的 Mockito 版本。如果这对任何人有帮助,我会很高兴。
我想用 Powermock运行nner 替换我的 JUnitRunner(以便进一步使用简单 Mockito 没有的 Powermock 功能)。
所以我添加了依赖项,在我的测试 class 中替换了 运行ner,并添加了 @PrepareForTest 注释,并且在编写任何进一步的测试代码之前,运行 我现有的测试以验证它们。
在大约 25 项测试中,有 5 或 6 项由于明显的功能原因而失败(我的意思是它们失败是因为 运行 代码中的实际失败,而不是某些基础结构错误)。
在正常状态下,这些测试是 100% 一致且不不稳定的。
这样的更改怎么会在完全工作的测试中失败?
为了帮助您诊断问题,您必须 post 一些失败的测试。
但老实说;你走错了兔子洞!
PowerMock(ito) 提供的与 Mockito 相比仅有的两个特性是:它可以模拟静态调用和对 new() 的调用。
您为这些功能支付的奖励:
- Mockito 的后级版本是强加给你的。 Mockito 本身现在是 2.8 版本;但是 PowerMockito 不能与比 Mockito 2.0.40 beta 更新的任何东西一起工作(而且 Mockito 团队几乎 每周 发布一次!)
- PowerMock 依赖于字节码操作。意思是:模拟静态调用会改变你的 production 代码。是的,所有这些都有效。但是只要看看这里所有标记为 PowerMock 的 questions——您可能会注意到一个模式。有很多关于模糊问题的问题,这些问题通常没有答案。一旦您开始使用 Oracle 以外的其他 JVM ... "fun" 是有保证的。 (相信我,去过那里!)
- PowerMock 不能很好地与其他需要字节码操作的框架一起使用,例如用于覆盖测量的 EcLemma。
除此之外:您需要 使用 PowerMock 并非突然出现。它基于您创建了 hard-to-test 代码这一事实。
因此我的建议是:学习如何编写易于测试的代码(例如通过观看这些 videos)。那里的核心方面:易于测试的代码很可能也是 更好 设计的。 static导致紧耦合,破坏了面向对象的本质——多态性。
所以,我的建议是:升级到最新版本的 Mockito;而不是花时间学习 A) 在过去造成很多痛苦的框架 B) 鼓励您不要修复损坏的设计,而是解决它们。
2% 的个人经验:当我们开始单元测试时,我们的团队正在使用 PowerMock。我们花了无数个小时来研究其中一些奇怪的 PowerMock 问题。最后:我们学会了如何编写更好的生产代码;我们学习了如何使用 Mockito 正确地测试它们。我们不再使用 PowerMock;我们从未对那个决定感到后悔。
虽然这是一个旧的post,但我最近有类似的经历并且遇到了 PowerMock 和 Mockito 之间的依赖矩阵。
当我们在 Springboot 项目中同时使用 Mockito 和 PowerMock 依赖项时,我们需要注意我们使用的 PowerMock 和 Mockito 的版本。
这是相同的 dependency matrix。
通常Spring boot starter test 带有一个版本的Mockito。在我的例子中,我不得不从 starter 中排除 Mockito 依赖项,并添加与最新的 PowerMock 版本配合良好的 Mockito 版本。如果这对任何人有帮助,我会很高兴。