将spring-boot配置为仅针对特定依赖项进行自动配置以进行测试

时间:2014-05-25 15:35:01

标签: spring testing integration-testing spring-boot

我在类路径中有一个spring-bootspring-boot-starter-webspring-boot-starter-data项依赖项目。

compile "org.springframework.boot:spring-boot-starter-web:1.0.2.RELEASE"
compile "org.springframework.boot:spring-boot-starter-data-jpa:1.0.2.RELEASE"

现在,我想仅测试spring-data-jpa相关类。为此,我希望spring-boot仅对spring-boot-starter-data-jpa进行自动配置。但是,如果我在用于测试的@EnableAutoConfiguration课程中@Configuationspring-boot会尝试为spring-boot-starter-webspring-boot-starter-data-jpa自动配置。

@SpringApplicationConfiguration(classes = {DataConfig.class})
public class PersonRepositoryTests extends AbstractJUnit4SpringContextTests {

    @Autowired
    PersonRepository personRepository;

    @Test
    public void testSaveWithNameNull() {
        /* ... */
    }

}

@Configuration
@EnableAutoConfiguration
@EnableJpaRepositories(basePackageClasses = {RepoPackage.class})
@EntityScan(basePackageClasses = {DomainPackage.class})
@EnableTransactionManagement
public class DataConfig {

}

如何配置spring boot以便仅为测试目的自动配置特定依赖项?

在我的上下文中,我希望spring-boot仅自动配置spring-data-jpa相关配置,省略web相关配置。

或者,还有其他更好的方法可以在spring-boot中设置这种类型的测试配置吗?

3 个答案:

答案 0 :(得分:4)

即使上面的答案是正确的一个额外的评论。

@EnableAutoConfiguration注释开始自动配置它在类路径上找到的所有内容。您可以通过排除某些自动配置类来排除内容,例如:

@AutoConfiguration(exclude = {
    DataSourceAutoConfiguration.class,
    HibernateJpaAutoConfiguration.class
})

同样,您可以通过@Import自动配置类自动配置部分功能。像:

@Import({DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})

我的真实世界的例子:

  • 我的主应用程序@EnableAutoConfiguration上有@Configuration
  • 我有一个使用DB的模块可能被禁用,在这种情况下我根本不想自动配置数据库
  • 所以我从主配置中排除了自动配置
  • 并在@Import
  • 守护的模块配置中添加了@Conditional

答案 1 :(得分:1)

我想你已经拥有它了。如果您使用@SpringApplicationConfiguration但未指定@WebAppConcfiguration,那么您将无法获得Web应用程序,因此没有MVC层。

答案 2 :(得分:0)

@ImportAutoConfiguration注释,您可以将其用于此目的。

在groovy中有我的示例,但是您可以简单地将其重写为Java:

配置类:

@Configuration
@ImportAutoConfiguration(classes = [HibernateJpaAutoConfiguration.class, DataSourceAutoConfiguration.class])
@EntityScan(basePackages = 'package.with.entities')
@EnableJpaRepositories(basePackages = 'package.with.repositories')
class JpaRepositoryConfig {

}

测试类:

@ContextConfiguration(classes = JpaRepositoryConfig,
initializers = ConfigFileApplicationContextInitializer.class) //initializer is for loading config from application.yml
class YourTestClass {