问题描述
我正在使用JunitRunner来运行使用PowerMock和Mockito编写的单元测试.
I am using JunitRunner for running unit tests written using PowerMock and Mockito .
使用的Spring Boot版本是
Spring Boot Version used is
<version>2.0.5.RELEASE</version>
pom.xml具有以下依赖性
pom.xml has below dependencies
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>2.0.0-beta.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>2.0.0-beta.5</version>
<scope>test</scope>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4-rule-agent</artifactId>
<version>2.0.0-beta.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-javaagent</artifactId>
<version>2.0.0-beta.5</version>
</dependency>
测试类的注释如下所示
@RunWith(JUnit4.class)
@PrepareForTest({SomeXService.class})
运行测试用例时,出现如下所示的错误
When I run the testcase, I am getting error shown as below
java.lang.IllegalStateException:无法清除JavaAgentClassRegister.尚未调用Set方法. 在org.powermock.api.extension.agent.JavaAgentFrameworkRegisterImpl.clear(JavaAgentFrameworkRegisterImpl.java:41) 在org.powermock.modules.junit4.rule.PowerMockStatement.clearFrameworkAgentClassRegister(PowerMockRule.java:84) 在org.powermock.modules.junit4.rule.PowerMockStatement.evaluate(PowerMockRule.java:78) 在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 在org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 在org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 在org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:290) 在org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:71) 在org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 在org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58) 在org.junit.runners.ParentRunner上$ 2.evaluate(ParentRunner.java:268) 在org.junit.runners.ParentRunner.run(ParentRunner.java:363) 在org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89) 在org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41) 在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541) 在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763) 在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463) 在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
java.lang.IllegalStateException: Cannot clear JavaAgentClassRegister. Set method has not been called. at org.powermock.api.extension.agent.JavaAgentFrameworkRegisterImpl.clear(JavaAgentFrameworkRegisterImpl.java:41) at org.powermock.modules.junit4.rule.PowerMockStatement.clearFrameworkAgentClassRegister(PowerMockRule.java:84) at org.powermock.modules.junit4.rule.PowerMockStatement.evaluate(PowerMockRule.java:78) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
可能是什么原因?如何进行这项工作?
What Could be the reason?How to make this work?
推荐答案
在JDK 8和PowerMock 2.0.2上运行测试时,我遇到了同样的问题,并遇到了以下异常情况.只有在我尝试了JDK 9和11的JDK 8上才发生,它们工作得很好.显然,这与ByteBuddy代理有关.
I had the same problem when running my tests on JDK 8 and PowerMock 2.0.2 and got the following chain of exceptions. It only happens with JDK 8 I tried JDK 9 and 11 and they work perfectly fine. Apparently it has something to do with ByteBuddy agent.
Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)
Failed to load interface org.mockito.plugins.MockMaker implementation declared in sun.misc.CompoundEnumeration@ff7da2b
Failed to load MockMaker implementation: mock-maker-inline
Internal problem occurred, please report it. Mockito is unable to load the default implementation of class that is a part of Mockito distribution. Failed to load interface org.mockito.plugins.MockMaker
Could not initialize inline Byte Buddy mock maker. (This mock maker is not supported on Android.)
Java : 1.8
JVM vendor name : Oracle Corporation
JVM vendor version : 25.171-b11
JVM name : Java HotSpot(TM) 64-Bit Server VM
JVM version : 1.8.0_171-b11
JVM info : mixed mode
OS name : Mac OS X
OS version : 10.15.2
Error during attachment using: net.bytebuddy.agent.ByteBuddyAgent$AttachmentProvider$Compound@c746e76
您没有看到上述异常的原因是PowerMock规则的finally块引发了一个异常,该异常掩盖了我上面显示的异常.
The reason you don't see the above exceptions is PowerMock rule's finally block throws an exception that masks the exception I've shown above.
@Override
public void evaluate() throws Throwable {
Object annotationEnabler = loadAnnotationEnableIfPresent();
try {
injectMocksUsingAnnotationEnabler(target, annotationEnabler); //This line throws the exception I've shown above
setFrameworkAgentClassRegister();
fNext.evaluate();
} finally {
MockRepository.clear();
clearMockFields(target, annotationEnabler);
clearFrameworkAgentClassRegister();// This line throws another exception masking the first one
}
}
要查看上述异常,您需要对运行测试的过程进行远程调试.在Maven中,您可以使用-Dmaven.surefire.debug
选项.
To see the above exceptions you need to remote debug the process that runs your tests. In maven you can use -Dmaven.surefire.debug
options.
这篇关于如何修复java.lang.IllegalStateException:无法清除JavaAgentClassRegister.尚未调用Set方法.的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!