Micronaut:初始化jdbc连接时MicronautTest中的竞争条件



由于从Micronaut 1.3.2升级到1.3.4,我们涉及jdbc层的单元测试随机失败,错误为:

io.microauth.transaction.exceptions.NoTransactionException:当前不存在事务。考虑在周围的方法上声明@Transactional

大约50%的时间失败

异常发生在此代码块中

@PostConstruct
@Transactional
private fun init() {
liquibase = Liquibase(
"db/liquibase-changelog.xml",
ClassLoaderResourceAccessor(),
JdbcConnection(dataSource.getConnection())
)
}

此类

@Singleton
open class TestUtils {
@Inject
@field:Client("/")
lateinit var client: HttpClient
@Inject
lateinit var objectMapper: ObjectMapper
@field:Property(name = "micronaut.application.name")
lateinit var applicationName: String
@field:Property(name = "micronaut.application.version")
lateinit var applicationVersion: String
@field:Property(name = "testing.security.access-token")
lateinit var accessToken: String
@Inject
lateinit var dataSource: DataSource
private var liquibase: Liquibase? = null
@PostConstruct
@Transactional
private fun init() {
liquibase = Liquibase(
"db/liquibase-changelog.xml",
ClassLoaderResourceAccessor(),
JdbcConnection(dataSource.getConnection())
)
}
fun tearDownDatabase(){
liquibase?.dropAll()
}
fun setUpDatabase(){
liquibase?.update("")
}
}

终于找到了一个解决方案,不得不将liquibase的初始化转移到它自己的方法:

@PostConstruct
private fun init() {
initLiquibase()
}
@Transactional
private fun initLiquibase() {
liquibase = Liquibase(
"db/liquibase-changelog.xml",
ClassLoaderResourceAccessor(),
JdbcConnection(dataSource.getConnection())
)
}

现在它似乎再次100%工作

最新更新