Skip to content

Instantly share code, notes, and snippets.

@juherr
Created August 17, 2015 16:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save juherr/69b3f7604f03c1946207 to your computer and use it in GitHub Desktop.
Save juherr/69b3f7604f03c1946207 to your computer and use it in GitHub Desktop.
Byte Buddy issue with PowerMock
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();
}
}
...
<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>
...
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
@raphw
Copy link

raphw commented Aug 17, 2015

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!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment