2012-06-27 34 views
3

我正在使用easymock + powermock編寫測試,我使用powermock的原因是模擬靜態方法。mockito + easymock - NoClassDefFoundError:net/sf/cglib/proxy/Enhancer

我的測試類的樣子:

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"); 
     ........ 
} 

這裏是我的測試依賴和版本:

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

運行測試,我initializationError如下:

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$1.run(Unknown Source) 
at java.net.URLClassLoader$1.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 

有有人遇到過這個問題嗎?

回答

1

您的類路徑中需要cglib

+0

我聽說過依賴性問題已在更高版本的easymock中解決? – Shengjie

+1

不,最新的[文檔](http://easymock.org/EasyMock3_1_Documentation.html)提到它仍然依賴於cglib。 – Premraj

+1

我已經添加了cglib,但我仍然有例外。我已經通過gradle添加了lib並作爲模塊,並且以太方式仍然出現異常 – ventura8

0

在maven中添加cglib依賴項解決了我的初始化powermock 1.5.5的錯誤問題,如@Premraj所述。對於1.4.12 Powermock,cglib的版本2.2.2應該可以做到。

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

對我來說,添加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> 

作爲介紹here。注意我沒有使用easymock(我使用mockito代替)

+1

Easymock與mockito不兼容。 –