如何修复java.lang.IllegalStateException:无法清除JavaAgentClassRegister。尚未调用Set方法。?

问题描述 投票:1回答:1

我正在使用JunitRunner来运行使用PowerMock和Mockito编写的单元测试。

使用的Spring Boot版本是

<version>2.0.5.RELEASE</version>

pom.xml具有以下依赖性

     <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})

运行测试用例时,出现如下所示的错误

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)

可能是什么原因?如何进行这项工作?

spring-boot mockito junit4 powermockito
1个回答
0
投票

在JDK 8和PowerMock 2.0.2上运行测试时,我遇到了同样的问题,并得到了以下异常链。只有在我尝试了JDK 9和11的JDK 8上才发生,它们工作得很好。显然,它与ByteBuddy代理有关。

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块引发了一个异常,该异常掩盖了我上面显示的异常。

 @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选项。

© www.soinside.com 2019 - 2024. All rights reserved.