В JUnit 4 вы можете использовать правило для переноса теста, чтобы вы могли выполнять код как до, так и после запуска теста. В большинстве случаев это можно сделать с помощью методов @Before и @After или правила ExternalResource. Однако некоторые конструкции потока управления (например, try-with-resources) нельзя разделить на два метода. В большинстве случаев есть альтернативы этим конструкциям, которые позволяют разделить их на два метода. Например, с помощью try-with-resources вы можете вручную получить и закрыть ресурс вместо использования блока try.
Конкретная проблема, с которой я столкнулся, состоит в том, что библиотека базы данных, которую я использую, jOOQ, имеет только методы транзакций, которые принимают обратный вызов. (См. https://www.jooq.org/doc/latest/manual/sql-execution/transaction-management/) Вы не можете назвать что-то вроде:
context.startTransaction()
doStuff()
context.commit() // Or rollback()
В JUnit4 это нормально, потому что вы можете написать правило так (в Kotlin, но эквивалент работает в Java):
class TransactionRule(private val dbSessionManager: DBSessionManager) : TestRule {
override fun apply(base: Statement, description: Description): Statement {
return object : Statement() {
override fun evaluate() {
dbSessionManager.transaction {
base.evaluate()
}
}
}
}
}
Есть ли что-нибудь подобное в JUnit 5?