无法模拟 0 行导致 jOOQ

Cannot mock 0 rows result in jOOQ

我在使用 jOOQ(版本 3.12.3)模拟空结果时遇到问题。我使用 MockDataProvider,但它仍然是 return 一行。 这是MockDataProvider的代码:

        class DataProvider implements MockDataProvider {
            @Override
            public MockResult[] execute(MockExecuteContext ctx) {
                return new MockResult[]{new MockResult(0, null)};
            }
        }
        var dbContext = DSL.using(new MockConnection(new DataProvider()));
        //....

所以它应该 return 0 行,这就是所需要的。但是,它实际上 returns 1 行,0 作为值。

12:51:34.799 [main] DEBUG org.jooq.tools.LoggerListener - Affected row(s)          : 0
12:51:34.863 [main] DEBUG org.jooq.tools.LoggerListener - Fetched result           : +--------+
12:51:34.863 [main] DEBUG org.jooq.tools.LoggerListener -                          : |metadata|
12:51:34.863 [main] DEBUG org.jooq.tools.LoggerListener -                          : +--------+
12:51:34.863 [main] DEBUG org.jooq.tools.LoggerListener -                          : |0       |
12:51:34.863 [main] DEBUG org.jooq.tools.LoggerListener -                          : +--------+
12:51:34.863 [main] DEBUG org.jooq.tools.LoggerListener - Fetched row(s)           : 1

非常感谢任何帮助或建议。

您的 MockResult 实例对 0 的更新计数进行编码以用于 DML 语句,而不是具有 0 行的结果集。为此,您必须创建:

new MockResult(0, result)

或者

Mock.of(result)

// some mock DSLContext configuration, as simple as DSL.using(SQLDialect.H2)
DSLContext ctx = ...
Result<Record> result = ctx.newResult(field1, field2);

在很多情况下,即使结果集是空的,jOOQ 也需要知道你的结果集的列名和类型。这些也存在于任何普通的空 SQL 结果集中。