2012-06-27 4 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, и у меня все еще есть исключение. Я добавил lib через gradle и в качестве модуля, и простой эфир исключение все еще появляется – ventura8

0

Добавление cglib-зависимостей в maven разрешило мне инициализациюError problem для powermock 1.5.5, как упоминалось @Premraj. Для 1.4.12 Powermock, вероятно, версия 2.2.2 cglib должна это сделать.

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