【问题标题】:Powermock JUnit tests are taking more time to execute compared to normal JUnit与普通 JUnit 相比,Powermock JUnit 测试需要更多时间来执行
【发布时间】:2014-02-18 06:44:28
【问题描述】:

我们正在使用 powermock 通过使用 @PrepareForTest 注释来模拟静态方法。测试运行良好,但问题是执行测试需要更多时间。

sn-p的代码如下:

@PrepareForTest({ StaticClass1.class, StaticClass2.class })

通常,没有模拟静态方法的 JUnit 需要大约 2 秒的时间来执行,但是当我们添加 @PrepareForTest 注释来模拟静态调用时,测试需要大约一分钟的时间来完成执行。对于一个测试,这不是一个很大的影响,但我们有超过 1K 的测试,整个构建时间需要超过 2 小时,而之前大约需要 20 到 30 分钟。

powermock 花费这么多时间的原因可能是什么。

任何帮助将不胜感激。

【问题讨论】:

  • powermock 执行的工具不是免费的。
  • 如果您的所有测试都需要 powermock,那么您可能遇到了严重的设计问题。尝试编写可测试的代码,即不需要 powermock 的黑魔法来测试的代码。使用依赖注入。
  • 感谢您的快速回复。但是你能告诉我你所说的仪器不是免费的吗?
  • 嗨 Nizet,我不需要 powermock 进行所有测试。可能用于大约 100 次测试,我需要使用它。但由于这些测试,它需要更多的时间。如果我从测试套件中删除这些并运行,那么它的工作速度非常快。
  • 然后尝试在两个单独的运行中运行 powermock 测试和“正常”测试。

标签: java junit powermock


【解决方案1】:

PowerMock 是一种对生成的类执行字节码检测的工具。一旦你的类被编译成 Java 字节码,PowerMock 就会出现并修改这个生成的类。否则不可能(通过使用 Java 代理)模拟私有或静态方法。

你应该只在那些你想使用 PowerMock 独有特性的类中使用@PrepareForTest 注释,例如模拟私有或静态方法。

【讨论】:

  • 感谢您对 powermock 仪器的解释。我只使用@PrepareForTest 注释来模拟构造函数调用、私有方法和静态方法。
  • 另外,在一个测试中,如果我模拟静态类,在 Test1 中说 StaticClass1。现在在 Test2 中,如果我想模拟同一个静态类,那么 powermock 将使用单独的 JVM 来维护这些静态调用。我担心的是,如果我为整个套件模拟一次这些静态调用,那么它必须在使用此静态调用模拟的所有测试类中重用。有什么方法可以实现吗?
  • @Srikanth 这是一个单独的问题。您可能需要考虑为每个测试类分叉您的 JVM:stackoverflow.com/a/1332135/207238
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 2020-01-28
相关资源
最近更新 更多