[英]Best way to test JPA Spring 3.1
我为Spring 3.1.1 / JPA / Hibernate 4 Web应用程序编写了几个JPA存储库,服务和支持类。 但是,我真的想为它编写一些单元和集成测试(我知道,你应该先编写它们)。 我使用JavaConfig而不是XML,所以我想知道最好的测试方法。 这是我要解决的特殊问题:
我有一个声明DataSource,JpaTransactionManager,LocalContainerEntityManagerFactoryBean和我所有存储库的@Configuration。 显然我不想为集成测试启动所有这些,所以我想我可以使用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。
有没有办法让reposository和embeddeddatabase隔离到我的测试而没有所有其他依赖项?
如果您想在完整集成测试中测试您的存储库,我会想象您需要设置其他所有内容,即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
}
}
您可以创建一个启动弹簧上下文的测试,如下所示:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = { MyConfigClass.class })
@ActiveProfiles(profiles = {"test"})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class TestRepository {
}
在此处,您可以指定测试活动的配置文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.