我为我的 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。
有没有办法让存储库和嵌入式数据库与我的测试隔离而没有所有其他依赖项?