java mockito + easymock - NoClassDefFoundError:net/sf/cglib/proxy/Enhancer

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11223640/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 04:17:35  来源:igfitidea点击:

mockito + easymock - NoClassDefFoundError:net/sf/cglib/proxy/Enhancer

javajunitmockitonoclassdeffounderrorpowermock

提问by Shengjie

I am writing a test using easymock + powermock, the reason I am using powermock is to mock a static method.

我正在使用 easymock + powermock 编写测试,我使用 powermock 的原因是模拟静态方法。

my test class looks like:

我的测试课看起来像:

import static org.powermock.api.easymock.PowerMock.mockStatic;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;

import org.mockito.Mockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticTest.class)
public class DummyTest {
    @Test
    public void testDummy() {
        mockStatic(StaticTest.class);
        Mockito.when(StaticTest.testMethod()).thenReturn("hello world");
        ........
}

here is my test dependencies and versions:

这是我的测试依赖项和版本:

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>1.4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-easymock</artifactId>
        <version>1.4.12</version>
        <scope>test</scope>
    </dependency>

Running the test, I got initializationError as below:

运行测试,我得到了如下的初始化错误:

java.lang.NoClassDefFoundError: net/sf/cglib/proxy/Enhancer
at org.powermock.api.extension.proxyframework.ProxyFrameworkImpl.isProxy(ProxyFrameworkImpl.java:29)
at org.powermock.reflect.internal.WhiteboxImpl.getUnmockedType(WhiteboxImpl.java:1783)
at org.powermock.reflect.internal.WhiteboxImpl.getType(WhiteboxImpl.java:2237)
at org.powermock.reflect.internal.WhiteboxImpl.setInternalState(WhiteboxImpl.java:327)
at org.powermock.reflect.proxyframework.RegisterProxyFramework.registerProxyFramework(RegisterProxyFramework.java:18)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.powermock.reflect.internal.WhiteboxImpl.performMethodInvocation(WhiteboxImpl.java:2014)
at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:885)
at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:859)
at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:466)
at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.registerProxyframework(AbstractTestSuiteChunkerImpl.java:154)
at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.getPowerMockTestListenersLoadedByASpecificClassLoader(AbstractTestSuiteChunkerImpl.java:107)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:144)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:39)
at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:217)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:59)
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.<init>(AbstractCommonPowerMockRunner.java:32)
at org.powermock.modules.junit4.PowerMockRunner.<init>(PowerMockRunner.java:31)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Caused by: java.lang.ClassNotFoundException: net.sf.cglib.proxy.Enhancer
at java.net.URLClassLoader.run(Unknown Source)
at java.net.URLClassLoader.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:143)
at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:67)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 39 more

has anybody run into this issue before?

有没有人遇到过这个问题?

采纳答案by Premraj

You need cglibin your classpath.

您的类路径中需要cglib

回答by saganas

Adding cglib dependency in maven solved me initializationError problem for powermock 1.5.5 as mentioned by @Premraj. For 1.4.12 Powermock probably version 2.2.2 of cglib should do it.

如@Premraj 所述,在 maven 中添加 cglib 依赖项解决了我的 powermock 1.5.5 的初始化错误问题。对于 1.4.12 Powermock,cglib 的 2.2.2 版可能应该这样做。

<dependency>
     <groupId>cglib</groupId>
     <artifactId>cglib</artifactId>
     <version>3.1</version>
     <scope>test</scope>
</dependency>

回答by lopisan

For me, adding cglib dependency didn't work. I solved the problem using:

对我来说,添加 cglib 依赖项不起作用。我使用以下方法解决了问题:

<!--
    We depend on the EasyMock API but exclude the EasyMock dependency. The reason
    is that PowerMock Whitebox needs a "org.powermock.reflect.spi.ProxyFramework"
    implementation in order to work correctly. This implementation is provided by
    the extension API:s. Since JMock uses CGLib it can reuse the
    "org.powermock.api.extension.proxyframework.ProxyFrameworkImpl" in the
    PowerMock EasyMock API. An alternative to depend on this class would be to simply copy
    the class it into your code (remember that the class must be named
    org.powermock.api.extension.proxyframework.ProxyFrameworkImpl).
-->
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-easymock</artifactId>
    <version>${project.version}</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.easymock</groupId>
            <artifactId>easymock</artifactId>
        </exclusion>
    </exclusions>
</dependency>

as presented here. Note I'm not using easymock (I use mockito instead)

如此处所示。注意我没有使用easymock(我使用mockito代替)

回答by user1000535

I tried multiple option, finally below dependency worked for me. Should use the higher version of PowerMock and Mockito to work in spring boot application.

我尝试了多种选择,最终下面的依赖对我有用。应该使用更高版本的 PowerMock 和 Mockito 在 spring boot 应用程序中工作。

Below is the maven dependency:

下面是maven依赖:

spring-boot: 2.0.1.RELEASE( contains junit: 4.12 version by default)

spring-boot:2.0.1.RELEASE(默认包含junit:4.12版本)

` 1.8 2.0.0-beta.5

` 1.8 2.0.0-beta.5

</properties>

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito2</artifactId>
        <version>${powermock-version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>${powermock-version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-core</artifactId>
        <version>${powermock-version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4-rule</artifactId>
        <version>${powermock-version}</version>
        <scope>test</scope>
    </dependency>'

回答by user84

I resolved the same issue after adding below dependencies.

添加以下依赖项后,我解决了同样的问题。

testCompile('org.powermock:powermock-api-mockito2:2.0.0-beta.5')
testCompile('org.powermock:powermock-module-junit4:2.0.0-beta.5')