【问题标题】:Best way to test JPA Spring 3.1测试 JPA Spring 3.1 的最佳方法
【发布时间】:2012-11-25 14:35:46
【问题描述】:

我已经为我的 Spring 3.1.1/JPA/Hibernate 4 Web 应用程序编写了几个 JPA 存储库、服务和支持类。但是,我真的很想为它写一些单元和集成测试(我知道,你应该先写这些)。我使用的是 JavaConfig 而不是 XML,所以我想知道最好的测试方法。这是我要解决的特定问题:

我有一个 @Configuration,它声明了 DataSource、JpaTransactionManager、LocalContainerEntityManagerFactoryBean 和我所有的存储库。显然我不想为集成测试开始所有这些,所以我想我可以使用 EmbeddedDatabase 和 H2 创建一个内存数据库,填充值,然后使用我的存储库来对付它。但是,我看到的文档并没有帮助我把它放在一起。我有这个:

@RunWith( SpringJUnit4ClassRunner.class )
public class TestMenuService {

    private EmbeddedDatabase database;

    @Autowired
    private MenuRepository menuRepository;

    @Before
    public void setUp() throws Exception {
        database = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).setName("myschema")
                .addScript("classpath:schema.sql").build();

        menuRepository = new MenuRepository();
        Assert.assertNotNull(database);
    }

但是 menuRepository 没有被实例化,所以我尝试创建我的 @Configuration 的测试版本

@Configuration } )
@ComponentScan( basePackages = { "com.mycompany.service"} )
@EnableTransactionManagement
@ImportResource( "classpath:applicationContext.xml" )
@PropertySource( "classpath:test-application.properties" )
public class TestEdmConfiguration {

    @Bean
    MenuRepository menuRepository() {
        return new MenuRepository();
    }

我的 test-applicationContext.xml

<jpa:repositories base-package="com.mycompany.servce.repository"/>

我的 test-application.properties:

db.driver=org.h2.Driver
db.username=sa
db.password=
db.url=jdbc:h2:mem:myschema

hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.format_sql=true
hibernate.hbm2ddl.auto=create
hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
hibernate.show_sql=true

但这需要我创建上面提到的所有数据源等。好像我只是在复制这个的所有支持 bean。

有没有办法让存储库和嵌入式数据库独立于我的测试而没有所有其他依赖项?

【问题讨论】:

    标签: spring junit4 spring-data-jpa spring-test


    【解决方案1】:

    如果您想在完整的集成测试中测试您的存储库,我会认为您需要设置其他所有内容,即 EntityManagerFactory、PlatformTransactionManager 等。

    由于您使用的是 Spring 3.1,我建议您使用 bean 配置文件来实现这一点。

    我会创建两个配置文件,一个用于测试,一个用于应用程序,每个都提供一个数据源。

    @Configuration
    @Profile("test")
    public class EmbeddedDataSource {
    
      @Bean
      public DataSource dataSource() {
        // Return a H2 datasource
      }
    
    }
    
    @Configuration
    @Profile("application")
    public class ApplicationDataSource {
    
      @Bean
      public DataSource dataSource() {
        // Return a normal datasource
      }
    
    }
    

    您可以创建一个启动 spring 上下文的测试,如下所示:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = { MyConfigClass.class })
    @ActiveProfiles(profiles = {"test"})
    @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
    public class TestRepository {
    
    
    
    }
    

    您可以在此处指定对测试有效的配置文件。

    【讨论】:

    • 我会尝试这种方法,但我希望我可以只使用嵌入式数据库、jpa 和服务,而无需为我的集成测试实例化整个堆栈。对这些组件进行单元测试的最佳方法是什么?
    • 单元测试与集成测试有很大不同,我相信您知道。集成测试意味着您针对整个堆栈进行测试。要对 bean 进行单元测试,您应该在手动实例化它时使用 Mockito 或类似工具将模拟依赖项传递给构造函数。然后,您可以单独测试该行为。
    猜你喜欢
    • 2015-10-01
    • 2013-04-23
    • 2018-08-12
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多