Java 与普通JUnit相比,Powermock JUnit测试的执行时间更长

Java 与普通JUnit相比,Powermock JUnit测试的执行时间更长,java,junit,powermock,Java,Junit,Powermock,我们使用powermock通过@PrepareForTest注释模拟静态方法。测试运行正常,但问题是执行测试需要更多的时间 代码片段如下所示: @PrepareForTest({ StaticClass1.class, StaticClass2.class }) 通常,不模拟静态方法的JUnit执行大约需要2秒的时间,但是当我们为模拟静态调用添加@PrepareForTest注释时,测试大约需要一分钟的时间来完成执行。对于一个测试来说,这不是一个很大的影响,但是我们有超过1K的测试,总体构建时

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

代码片段如下所示:

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

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


任何帮助都将不胜感激。

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


您应该仅在希望使用PowerMock独有功能的类中使用
@PrepareForTest
注释,例如mocking private或static方法

powermock执行的检测不是免费的。如果您的所有测试都需要powermock,那么您可能会遇到严重的设计问题。尝试编写可测试的代码,即不需要测试powermock的黑魔法的代码。使用依赖注入。感谢您的快速回复。但是你能告诉我你所说的仪器不是免费的吗。可能是大约100个测试,我需要使用它。但由于这些测试,它需要更多的时间。如果我从测试套件中删除这些测试并运行,那么它工作得非常快。然后尝试在两个单独的运行中运行powermock测试和“正常”测试。感谢您对powermock检测的解释。我使用@PrepareForestAnnoation只模拟构造函数调用、私有方法和静态方法。另外,在一个测试中,如果我模拟静态类,请在Test1中使用StaticClass1。现在在Test2中,如果我想模拟相同的静态类,那么powermock将使用单独的JVM来维护这些静态调用。我关心的是,如果我对整个套件模拟这些静态调用一次,那么它必须在使用此静态调用模拟的所有测试类中重用。有没有办法实现这一点?@Srikanth这是另一个问题。您可能需要考虑每个测试类分叉JVM: