在 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()
Run Code Online (Sandbox Code Playgroud)
在 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()
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
JUnit 5 中有类似的东西吗?
据我了解,您不能使用JUnit 5 测试生命周期回调,因为它们要求您遵循您指示doStuff的调用路线/您指示的不起作用。contextBeforeAfter
使用 JUnit 5动态测试可以吗?
这提供了由具有名称和可执行文件(lambda)的动态测试集合组成的测试工厂。然后你可以做这样的事情:
import static org.junit.jupiter.api.DynamicTest.dynamicTest;
import org.junit.jupiter.api.function.Executable;
@TestFactory
Collection<DynamicTest> transactionTestCollection() {
return Arrays.asList(
dbTest("1st dynamic test", () -> assertTrue(true)),
dbTest("2nd dynamic test", () -> assertEquals(4, 2 * 2))
);
}
private DynamicTest dbTest(String name, Executable tst) {
return dynamicTest(name, () -> dbSessionManager.transaction(tst));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1064 次 |
| 最近记录: |