AbstractIntegrationTest 上的 @EnableAutoConfiguration 可能吗?

hot*_*zen 5 spring-boot spring-boot-test

有很多像这样的集成测试实现:

// no @Annotations at all
class SomeIntegrationTest extends AbstractIntegrationTest {
  ...
}
Run Code Online (Sandbox Code Playgroud)

使用(Spring Boot 1.5,JUnit 5)

@SpringBootTest(classes = {CoreConfiguration.class, RestTemplateAutoConfiguration.class, JacksonAutoConfiguration.class})
@ExtendWith(SpringExtension.class)
@AutoConfigureMockMvc
@Transactional
public abstract class AbstractIntegrationTest {
  ...
}
Run Code Online (Sandbox Code Playgroud)

这总是失败

org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type 'javax.persistence.EntityManagerFactory' available
Run Code Online (Sandbox Code Playgroud)

除非我注释每个IntegrationTest-Implementation

@EnableAutoConfiguration    
class SomeIntegrationTest extends AbstractIntegrationTest {
 ...
}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么我不能@EnableAutoConfigurationAbstractIntegrationTest并用它做。(这样做时,它失败了IllegalArgumentException: No auto-configuration attributes found. Is package.SomeIntegrationTest annotated with EnableAutoConfiguration?

我们正常的应用程序看起来像这样:

@SpringBootApplication
@Import({CoreConfiguration.class, OtherConfiguration.class})
public class WebApp {
Run Code Online (Sandbox Code Playgroud)

这里@SpringBootApplication显然暗示, @EnableAutoConfiguration但我想避免*IntegrationTest用这个注释每一个,而是在AbstractIntegrationTest.

这是在以任何方式与 spring-boot 作斗争还是有什么方法可以实现这一目标?谢谢。

bob*_*sie 5

您可以创建更新您的AbstractIntegrationTest抽象类以拥有一个小的内部配置类,例如TestConfiguration使用@Import(TestConfiguration.class)注释加载的类。

@SpringBootTest(classes = {CoreConfiguration.class, RestTemplateAutoConfiguration.class, JacksonAutoConfiguration.class})
@ExtendWith(SpringExtension.class)
@AutoConfigureMockMvc
@Transactional
@Import(AbstractIntegrationTest.TestConfiguration.class)   // <---- import the configuration
public abstract class AbstractIntegrationTest {

    @EnableAutoConfiguration
    // Any other applicable annotations e.g. @EntityScan
    static class TestConfiguration {

    }

    ....

}
Run Code Online (Sandbox Code Playgroud)