RequestJsonTests from the smoke tests don't work in a native image. I get the following exception:
JUnit Jupiter:RequestJsonTests:parse()
MethodSource [className = 'com.example.webmvc.RequestJsonTests', methodName = 'parse', methodParameterTypes = '']
=> org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'null': Unsatisfied dependency expressed through field 'tester': No qualifying bean of type 'org.springframework.boot.test.json.JacksonTester<com.example.webmvc.dto.Request>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:744)
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:724)
org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:127)
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.processInjection(AutowiredAnnotationBeanPostProcessor.java:506)
org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependenciesInAotMode(DependencyInjectionTestExecutionListener.java:153)
[...]
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.boot.test.json.JacksonTester<com.example.webmvc.dto.Request>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1782)
org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1341)
org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1295)
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:741)
[...]
reproducer: run nativeTest in the webmvc-tomcat smoke tests.
Comment From: wilkinsona
The same failures occur on the JVM when running AOT-processed tests:
tasks.named("test").configure {
systemProperty "spring.aot.enabled", "true"
}
Comment From: wilkinsona
This is, at least in part, a Framework bug. I've opened https://github.com/spring-projects/spring-framework/issues/29385. Let's keep this issue open for now to check that things work once the problem in Framework has been corrected. There's some reflection in JsonTesterFactoryBean that may fail but isn't being called yet.
Comment From: wilkinsona
With the latest Framework changes, AOT-processed tests now pass. Native tests fail with an error like this:
JUnit Jupiter:JsonApplicationTests:deserializeDto3()
MethodSource [className = 'com.example.json.JsonApplicationTests', methodName = 'deserializeDto3', methodParameterTypes = '']
=> org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'null': Unsatisfied dependency expressed through field 'dtoTester': Error creating bean with name 'jacksonTesterFactoryBean': FactoryBean threw exception on object creation
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:744)
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:724)
org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:127)
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.processInjection(AutowiredAnnotationBeanPostProcessor.java:506)
org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependenciesInAotMode(DependencyInjectionTestExecutionListener.java:159)
[...]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jacksonTesterFactoryBean': FactoryBean threw exception on object creation
org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:154)
org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:124)
org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1823)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getObjectForBeanInstance(AbstractAutowireCapableBeanFactory.java:1265)
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:349)
[...]
Caused by: java.lang.IllegalStateException: class org.springframework.boot.test.json.JacksonTester does not have a usable constructor
org.springframework.boot.test.autoconfigure.json.JsonTestersAutoConfiguration$JsonTesterFactoryBean.getObject(JsonTestersAutoConfiguration.java:152)
org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:148)
[...]