Пересадка драйвера JDBC с использованием Acolyte - поддержка транзакций? - PullRequest
0 голосов
/ 02 мая 2018

Я использую Acolyte , чтобы смоделировать драйвер JDBC и проверить мой слой БД в Scala. Все в порядке, но я не могу найти способ проверить поведение транзакций (коммит, откат ...).

По сути, у меня есть что-то, что эмулирует UnitOfWork, и я хотел бы проверить, правильно ли вызываются команды commit и rollback:

У меня есть что-то вроде этого

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)

}

Но все, что связано с транзакцией, похоже, не поддерживается.

В документе написано, что есть псевдоподдержка, но я не могу ее найти.

Есть идеи?

...