Created
August 17, 2015 16:02
-
-
Save juherr/69b3f7604f03c1946207 to your computer and use it in GitHub Desktop.
Byte Buddy issue with PowerMock
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import net.bytebuddy.ByteBuddy; | |
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; | |
import org.mockito.Mock; | |
import org.powermock.core.classloader.annotations.PrepareForTest; | |
import org.powermock.modules.testng.PowerMockTestCase; | |
import org.testng.annotations.Test; | |
@PrepareForTest(ByteBuddyWithPowerMockTest.SampleClass.class) | |
public class ByteBuddyWithPowerMockTest extends PowerMockTestCase { | |
public static class SampleClass { } | |
@Mock | |
private SampleClass sample; | |
@Test | |
public void test() throws InstantiationException, IllegalAccessException { | |
System.out.println(sample); | |
System.out.println(proxy(sample)); | |
} | |
private static SampleClass proxy(SampleClass sample) | |
throws IllegalAccessException, InstantiationException { | |
return new ByteBuddy() | |
.subclass(sample.getClass()) | |
.make() | |
.load(sample.getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER) | |
.getLoaded().newInstance(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
... | |
<dependency> | |
<groupId>org.powermock</groupId> | |
<artifactId>powermock-module-testng</artifactId> | |
<version>1.6.2</version> | |
</dependency> | |
<dependency> | |
<groupId>org.powermock</groupId> | |
<artifactId>powermock-api-mockito</artifactId> | |
<version>1.6.2</version> | |
<exclusions> | |
<exclusion> | |
<groupId>org.mockito</groupId> | |
<artifactId>mockito-all</artifactId> | |
</exclusion> | |
</exclusions> | |
</dependency> | |
<dependency> | |
<groupId>org.mockito</groupId> | |
<artifactId>mockito-core</artifactId> | |
<version>1.10.19</version> | |
</dependency> | |
... |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
test/ByteBuddyWithPowerMockTest$SampleClass$$EnhancerByMockitoWithCGLIB$$86407ee5 | |
at java.lang.ClassLoader.defineClass1(Native Method) | |
at java.lang.ClassLoader.defineClass(ClassLoader.java:760) | |
at net.bytebuddy.dynamic.loading.ByteArrayClassLoader.access$300(ByteArrayClassLoader.java:19) | |
at net.bytebuddy.dynamic.loading.ByteArrayClassLoader$ClassLoadingAction.run(ByteArrayClassLoader.java:420) | |
at net.bytebuddy.dynamic.loading.ByteArrayClassLoader$ClassLoadingAction.run(ByteArrayClassLoader.java:375) | |
at java.security.AccessController.doPrivileged(Native Method) | |
at net.bytebuddy.dynamic.loading.ByteArrayClassLoader.findClass(ByteArrayClassLoader.java:131) | |
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) | |
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) | |
at net.bytebuddy.dynamic.loading.ByteArrayClassLoader.load(ByteArrayClassLoader.java:120) | |
at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default$WrappingDispatcher.load(ClassLoadingStrategy.java:265) | |
at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default.load(ClassLoadingStrategy.java:107) | |
at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:3179) | |
at test.ByteBuddyWithPowerMockTest.proxy(ByteBuddyWithPowerMockTest.java:30) | |
at test.ByteBuddyWithPowerMockTest.test(ByteBuddyWithPowerMockTest.java:22) | |
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | |
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) | |
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) | |
at java.lang.reflect.Method.invoke(Method.java:497) | |
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85) | |
at org.testng.internal.Invoker.invokeMethod(Invoker.java:659) | |
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:845) | |
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1153) | |
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125) | |
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108) | |
at org.testng.TestRunner.privateRun(TestRunner.java:771) | |
at org.testng.TestRunner.run(TestRunner.java:621) | |
at org.testng.SuiteRunner.runTest(SuiteRunner.java:357) | |
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:352) | |
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:310) | |
at org.testng.SuiteRunner.run(SuiteRunner.java:259) | |
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) | |
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) | |
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1199) | |
at org.testng.TestNG.runSuitesLocally(TestNG.java:1124) | |
at org.testng.TestNG.run(TestNG.java:1032) | |
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72) | |
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:122) | |
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | |
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) | |
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) | |
at java.lang.reflect.Method.invoke(Method.java:497) | |
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) | |
Caused by: java.lang.ClassNotFoundException: test.ByteBuddyWithPowerMockTest$SampleClass$$EnhancerByMockitoWithCGLIB$$86407ee5 | |
at net.bytebuddy.dynamic.loading.ByteArrayClassLoader$ClassLoadingAction.run(ByteArrayClassLoader.java:422) | |
at net.bytebuddy.dynamic.loading.ByteArrayClassLoader$ClassLoadingAction.run(ByteArrayClassLoader.java:375) | |
at java.security.AccessController.doPrivileged(Native Method) | |
at net.bytebuddy.dynamic.loading.ByteArrayClassLoader.findClass(ByteArrayClassLoader.java:131) | |
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) | |
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) | |
... 43 more |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I am currently on vacation, but I will look at it first time I am back. First suspicion: Byte Buddy is not currently configured to keep a reference to the generated class'es byte code after it is first loaded. Try the manifest version of the wrapper strategy. I guess, power mock requires explicit access to the byte code!