Springboot 测试高速化-2

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

Related Posts

Leave a Reply

Your email address will not be published. Required fields are marked *

Close Bitnami banner
Bitnami