上次说了几个使用DI为前提的情况下的测试速度优化方案。
这里想再总结下怎么通过不使用DI(Standalone模式)去进行测试。
然后这次总结的主要是Repository层面的Standalone模式的测试。
需要实现Standalone模式,主要需要解决这么几个问题:
- 创建DataSource
- 创建EntityManager
- 创建DSLContext(如果使用了jooq)
- 实例化JpaRepository
创建DataSource可以参考下面这段代码,当然最好这些property可以从spring的配置文件里读取。
val ds = DriverManagerDataSource().apply {
setDriverClassName("com.mysql.cj.jdbc.Driver")
url = "jdbc:mysql://xyc:3306/schema_name"
username = "username"
password = "password"
connectionProperties = Properties().apply {
setProperty("autoCommit", "false")
}
}
创建EntityManager的话,主要有两种方式,一种是带transacation的:
private val entityManager: EntityManager
get() {
val factoryBean = LocalContainerEntityManagerFactoryBean()
factoryBean.dataSource = TransactionAwareDataSourceProxy(ds)
factoryBean.persistenceUnitName = "test_persistence"
factoryBean.jpaVendorAdapter = HibernateJpaVendorAdapter()
factoryBean.afterPropertiesSet()
return factoryBean.nativeEntityManagerFactory.createEntityManager()
}
还有一种是不带transacation的:
private val entityManager: EntityManager
get() {
val emf = Persistence.createEntityManagerFactory("test_persistence")
return emf.createEntityManager()
}
DSLContext的话,像下面这种方法比较简单:
val dsl: DSLContext
get() {
return DefaultDSLContext(
DefaultConfiguration().apply {
set(DataSourceConnectionProvider(TransactionAwareDataSourceProxy(ds)))
}
)
}
最后,如果你使用了JpaRepository,那么就需要对它实例化才能使用:
val factory = JpaRepositoryFactory(entityManager)
repository = factory.getRepository(UserRepository::class.java)
在我的项目中,因为还使用了Customize的JpaRepository,所以这里还有另外一种写法:
val factory = JpaRepositoryFactory(entityManager)
repository = factory.getRepository(
UserRepository::class.java,
RepositoryFragments.just(*arrayOf(UserRepositoryImpl(dsl)))
)