如何包装 JUnit 5 测试

amc*_*mc6 5 junit junit5

在 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 中有类似的东西吗?

ava*_*sen 0

据我了解,您不能使用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)