上次说了几个使用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)))
)