首页 > 解决方案 > 使用 Acolyte 模拟 JDBC 驱动程序 - 事务支持?

问题描述

我正在使用Acolyte模拟 JDBC 驱动程序并在 Scala 中测试我的数据库层。没关系,但我找不到任何方法来测试事务行为(提交、回滚......)。

基本上我有一些模拟 UnitOfWork 的东西,我想测试一下是否适当地调用了提交和回滚命令:

我有这样的东西

def executeUnitOfWorkNoResult(sqlInstructions: List[String]) 
(connectionFactory:()=>Connection): Try[Unit] = {

import implicits.TryImplicits._

var connection: Connection = null

Try {
  connection = connectionFactory()
  connection.setAutoCommit(false)

  val execs = sqlInstructions.foldLeft(Try[Unit]())((tryInstance, sql)=> {
    tryInstance.flatMap(t => {

      val stmt:Statement = null
      Try {
        val stmt = connection.createStatement()
        stmt.execute(sql)
        ()
      }doFinally {

        Try{stmt.close}
      }
    })
  })

  execs match {
    case Success(_) => connection.commit()
    case Failure(e) => {
      connection.rollback()
      throw e
    }
  }

} doFinally {

  if (connection != null) {
    Try(connection.close)
  }
 }

}

测试基本的东西很好,例如测试命令是否被执行:

"executeUnitOfWork" should " execute commands" in {

 var insStmtCmt = 0;

 val handlerA = AcolyteDSL.handleStatement.withUpdateHandler { e =>

  if(e.sql.toLowerCase.startsWith("insert")){

    insStmtCmt = insStmtCmt+1
  }

  UpdateResult.One
}
def acquireMock() = AcolyteDSL.connection(handlerA)

val res = SqlUtils.executeUnitOfWorkNoResult(List(
  "insert into MetricDescription values('blaf','','','')",
  "insert into MetricDescription values('blaf2','','','')"))(acquireMock)

res.isSuccess shouldBe true

insStmtCmt should equal(2)

}

但似乎不支持与交易相关的任何内容。

在文档中写到有一个伪支持,但我找不到它。

任何想法 ?

标签: scalajdbcmockingscalatest

解决方案


推荐阅读