Я использую 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)
}
Но все, что связано с транзакцией, похоже, не поддерживается.
В документе написано, что есть псевдоподдержка, но я не могу ее найти.
Есть идеи?