Using MockKExtension in a unit test fails when running ./gradlew clean nativeTest.
The error is:
Failures (2):
JUnit Jupiter:DemoApplicationTests:contextLoads()
MethodSource [className = 'com.example.demo.DemoApplicationTests', methodName = 'contextLoads', methodParameterTypes = '']
=> java.lang.ExceptionInInitializerError
io.mockk.junit5.MockKExtension.postProcessTestInstance(MockKExtension.kt:177)
org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$10(ClassBasedTestDescriptor.java:377)
org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:382)
org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:377)
java.base@17.0.5/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
[...]
Caused by: java.lang.IllegalStateException: Cannot locate class file for Byte Buddy installer
net.bytebuddy.agent.ByteBuddyAgent$AgentProvider$ForByteBuddyAgent.createJarFile(ByteBuddyAgent.java:1501)
net.bytebuddy.agent.ByteBuddyAgent$AgentProvider$ForByteBuddyAgent.resolve(ByteBuddyAgent.java:1540)
net.bytebuddy.agent.ByteBuddyAgent.install(ByteBuddyAgent.java:631)
net.bytebuddy.agent.ByteBuddyAgent.install(ByteBuddyAgent.java:611)
net.bytebuddy.agent.ByteBuddyAgent.install(ByteBuddyAgent.java:563)
[...]
JUnit Jupiter:DemoApplicationTests
ClassSource [className = 'com.example.demo.DemoApplicationTests', filePosition = null]
=> java.lang.NoClassDefFoundError: Could not initialize class io.mockk.impl.JvmMockKGateway
io.mockk.junit5.MockKExtension.afterAll(MockKExtension.kt:189)
org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeAfterAllCallbacks$18(ClassBasedTestDescriptor.java:461)
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeAfterAllCallbacks$19(ClassBasedTestDescriptor.java:461)
java.base@17.0.5/java.util.ArrayList.forEach(ArrayList.java:1511)
org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeAfterAllCallbacks(ClassBasedTestDescriptor.java:461)
org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.after(ClassBasedTestDescriptor.java:235)
org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.after(ClassBasedTestDescriptor.java:84)
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:161)
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
[...]
I created a minimal example with minimal changes from start.spring.io: https://github.com/ArjanSchouten/spring-boot-mockk-native
I tried to add hints for io.mockk.impl.JvmMockKGateway but didn't manage to get it to work.
(./gradlew clean test just works)
Comment From: wilkinsona
Thanks for the report but this will have to be addressed in MockK or, perhaps, Mockito. You may also be interested in https://github.com/spring-projects/spring-boot/issues/32195 which is tracking support for Spring Boot's Mockito integration (@MockBean and @SpyBean) in a native image.