我们应该避免使用Powermock吗?

时间:2020-01-22 18:32:00

标签: java testing powermock powermockito

通常,Powermock允许我们模拟/添加静态行为或状态。例如,我们可以模拟实用程序类的静态方法,例如public static String buildKeyFrom(...) {...}并覆盖其行为。甚至在目标类尝试使用类new MyService(...)

的构造函数创建对象时返回模拟实例

powermock API用法的个示例

when(StorageKeyUtils.buildKey(id, group, suffixes)).thenReturn("my:group-test:an-id:suffix1") whenNew(MyParser.class).withArguments(factory).thenReturn(parserMock)

而且...它起作用了,实际上它有助于避免重构以提高代码的可测试性。您不再需要将静态行为提取到单独的类中,也无需引入工厂来实例化新对象等等。

但是,Powermock也有缺点

  1. 复杂的设置。 实际上,不仅仅是Mockito中的 whenSomething ,除了此功能和替换测试运行器之外,您还不得不使用@PrepareForTestPowerMock.mockStatic(..)。尝试记住注释和mockStatic内部要描述的类,而不检查先前实现的测试或文档。 有时,即使您仍尝试模拟静态方法,它也可以在没有mockStatic的情况下工作。 当然,我们可以花一些时间研究文档以澄清所有问题...
  2. 错误和故障。 有时它起作用,有时却不起作用。例子:
    1. 与覆盖工具冲突。由于与类的检测产生冲突,您可能会因测试而无法覆盖代码,例如-JaCoCo
    2. 尝试在Google上搜索powermock mbeanserver ...为什么powermockito试图滥用mbeanserver并迫使我们用@PowerMockIgnore标记测试集?自2013年以来。Bot有时可以正常运行而不会排除,为什么? -idk
    3. 无法模拟通过引用作为lambda传递的静态方法或构造函数,例如:``
  3. 它只是鼓励使用 static -OOP大使欢迎描述为什么我们不可以使用静态方法等

总体上,我会说是的,我们应该避免使用Powermock。我看到一个令人怀疑的案例-您没有时间进行适当的代码设计,以使其在没有power-mockito()的情况下也足够可测试,但是,如果您没有时间进行测试,您是否真的需要那种测试质量?代码设计?

您怎么看?您是否定期使用Powermock?在项目上使用Powermock时是否遵守一些规则?

2 个答案:

答案 0 :(得分:3)

通常,干净的代码不需要powermock进行测试。因为干净的代码支持依赖注入,所以松散耦合并且易于单元测试,因此不依赖静态方法。

传统/肮脏的代码充满了静态方法,紧密耦合且不支持依赖注入。在这些旧代码库中,您需要使用powermock进行测试

答案 1 :(得分:0)

我不推荐PowerMock,但生活并不总是如我们所愿,有时候您进入的项目,例如,它没有遵循最佳编程实践,那么我认为PowerMock是可以接受的。问题有点太广泛了。

相关问题