Hello,

I am using Spring Boot 3.0.2. I have tried to compile natively with mvn -PnativeTest clean test a test that uses the class ApplicationContextRunner. Without adding any 'RuntimeHints' it returns me the following error:

Failures (1):
  JUnit Jupiter:ContextRunnerTests:testContextRunner()
    MethodSource [className = 'com.example.errorcontextrunner.ContextRunnerTests', methodName = 'testContextRunner', methodParameterTypes = '']
    => com.oracle.svm.core.jdk.UnsupportedFeatureError: Proxy class defined by interfaces [interface org.springframework.context.ConfigurableApplicationContext, interface org.springframework.boot.test.context.assertj.AssertableApplicationContext] not found. Generating proxy classes at runtime is not supported. Proxy classes need to be defined at image build time by specifying the list of interfaces that they implement. To define proxy classes use -H:DynamicProxyConfigurationFiles=<comma-separated-config-files> and -H:DynamicProxyConfigurationResources=<comma-separated-config-resources> options.
       org.graalvm.nativeimage.builder/com.oracle.svm.core.util.VMError.unsupportedFeature(VMError.java:89)
       org.graalvm.nativeimage.builder/com.oracle.svm.core.reflect.proxy.DynamicProxySupport.getProxyClass(DynamicProxySupport.java:171)
       java.base@17.0.5/java.lang.reflect.Proxy.getProxyConstructor(Proxy.java:47)
       java.base@17.0.5/java.lang.reflect.Proxy.newProxyInstance(Proxy.java:1037)
       org.springframework.boot.test.context.assertj.ApplicationContextAssertProvider.get(ApplicationContextAssertProvider.java:112)
       org.springframework.boot.test.context.runner.AbstractApplicationContextRunner.createAssertableContext(AbstractApplicationContextRunner.java:389)
       org.springframework.boot.test.context.runner.AbstractApplicationContextRunner.consumeAssertableContext(AbstractApplicationContextRunner.java:362)
       org.springframework.boot.test.context.runner.AbstractApplicationContextRunner.lambda$run$0(AbstractApplicationContextRunner.java:341)
       org.springframework.boot.test.util.TestPropertyValues.lambda$applyToSystemProperties$1(TestPropertyValues.java:174)
       org.springframework.boot.test.util.TestPropertyValues.applyToSystemProperties(TestPropertyValues.java:188)
       [...]

It can be replicated using the following example https://github.com/ruben-garciapariente/error-context-runner-native

If I add the "RuntimeHints" for the application configuration class it returns the following error (example at https://github.com/ruben-garciapariente/error-context-runner-native/tree/2e07cbca3b716fc871c663593b0f326b5aabdf3a):

Failures (1):
  JUnit Jupiter:ContextRunnerTests:testContextRunner()
    MethodSource [className = 'com.example.errorcontextrunner.ContextRunnerTests', methodName = 'notWeb', methodParameterTypes = '']
    => java.lang.IllegalStateException: Unable to read meta-data for class com.example.errorcontextrunner.AutoConfig
       org.springframework.boot.autoconfigure.AutoConfigurationSorter$AutoConfigurationClass.getAnnotationMetadata(AutoConfigurationSorter.java:237)
       org.springframework.boot.autoconfigure.AutoConfigurationSorter$AutoConfigurationClass.getAnnotationValue(AutoConfigurationSorter.java:219)
       org.springframework.boot.autoconfigure.AutoConfigurationSorter$AutoConfigurationClass.getAfter(AutoConfigurationSorter.java:198)
       org.springframework.boot.autoconfigure.AutoConfigurationSorter$AutoConfigurationClasses.getClassesRequestedAfter(AutoConfigurationSorter.java:143)
       org.springframework.boot.autoconfigure.AutoConfigurationSorter.doSortByAfterAnnotation(AutoConfigurationSorter.java:90)
       [...]
     Caused by: java.io.FileNotFoundException: class path resource [com/example/errorcontextrunner/AutoConfig.class] cannot be opened because it does not exist
       org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:211)
       org.springframework.core.type.classreading.SimpleMetadataReader.getClassReader(SimpleMetadataReader.java:54)
       org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:48)
       org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:103)
       org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:81)
       [...]

Apparently there is no support for native compilation of an ApplicationContextRunner test. I have reviewed the following documentation and I have not found that it is indicated that it is not supported:

  • https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#native-image
  • https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-with-GraalVM

Thank you very much

Comment From: wilkinsona

Thanks for raising this.

Apparently there is no support for native compilation of an ApplicationContextRunner test

That's correct. There are no hooks for performing AOT processing of the context created by the runner. We'll update the documentation to reflect this limitation.