如何在SpringBootTest中的@DataJpaTest中导入配置类?

时间:2017-04-30 11:09:43

标签: spring unit-testing spring-boot configuration spring-data-jpa

我有一个 SpringBoot应用程序,我有一个带

的配置包
@Configuration
@EnableJpaAuditing
public class PersistenceConfig {
}

PersistenceConfig 不会在 PersonRepositoryTest

中被选中
@RunWith( SpringRunner.class )
@DataJpaTest
public class PersonRepositoryTest {

    // Tests ...
}

但是,如果我从@DataJpaTest to @SpringBootTest更改,PersonRepositoryTest将选择配置。

我的包结构

- main
    - java
        - config
              PersistenceConfig.java
        - domain
              Person.java
        - persistence
              PersonRepository.java
          Application.java // @SpringBootApplication

- test
    - java
        - persistence
              PersonRepositoryTest.java

Testing improvements in Spring Boot 1.4建议使用@DataJpaTest

测试持久层

观察: 在Test类上执行这两个注释仍然不会导入配置 @SpringBootTest @DataJpaTest

问题1: 使用@DataJpaTest测试持久层时 我如何正确(Spring Boot中的最佳实践方式)将配置包导入我的测试中?

问题2: 使用@SpringBootTest是否可以接受?我知道@DataJpaTest也是一个元注释,我的数据库有合理的自动配置,包括事务管理。但如果我不需要它呢?

3 个答案:

答案 0 :(得分:11)

解决方案是使用@Import将配置导入@DataJpaTest完成的配置。这是我对@Import的理解。

@RunWith(SpringRunner.class)
@DataJpaTest
@Import(AuditConfiguration.class)
public class AuditTest {
}

使用AuditConfiguration启用审核

@Configuration
@EnableJpaAuditing
public class AuditConfiguration {
}

答案 1 :(得分:5)

你可以试试这个: 使用PersistenceConfig注释@ComponentScan以在Spring中启用组件扫描。

@Configuration
@EnableJpaAuditing
@ComponentScan(basePackages = "com.yourbasepackage")
public class PersistenceConfig {
}

如果没有进一步配置,@ComponentScan将默认扫描与PersistenceConfig类相同的包。

添加@Context-Configuration注释以告诉它从PersistenceConfig.class加载其配置。

@RunWith( SpringRunner.class )
@DataJpaTest
@ContextConfiguration(classes=PersistenceConfig.class)
public class PersonRepositoryTest {

    // Tests ...
}

答案 2 :(得分:0)

在@georges van post之后,我发现所有配置类也可以通过在测试中添加一行来获取:

@RunWith( SpringRunner.class )
@DataJpaTest
@ComponentScan(basePackages = "com.basepackage.config")
public class PersonRepositoryTest {

    // Tests ...
}

如果有人只想要一个特定的配置类,您可以这样做:

@RunWith( SpringRunner.class )
@DataJpaTest
@ContextConfiguration(classes=MyConfig.class)
public class PersonRepositoryTest {

    // Tests ...
}

或多个类:

@ContextConfiguration(classes={MyConfig1.class, MyConfig2.class})