如何构造org.jooq.Result进行单元测试

How to construct org.jooq.Result for unit testing

我正在编写单元测试以使用 JOOQ 库从 Oracle DB 中获取记录,我需要模拟 DSLContextfetch() 函数返回的数据。如何创建由模拟函数返回的示例 Result<Record>?我在谷歌上搜索了几个小时,找不到答案。

尝试使用JOOQ自己的模拟API。这里是官方docs

您可能希望以这样的方式结束:

final MockDataProvider myMockProvider = new MockDataProvider() {
    @Override
    public MockResult[] execute(final MockExecuteContext context) throws SQLException {
        final DSLContext context = DSL.using(SQLDialect.ORACLE);
        final Result<Record> resultRecord = context.newResult(YOUR_TABLE_HERE);

        // customize your record with needed fields

        resultRecord.add(context.newRecord(YOUR_TABLE_HERE));

        return new MockResult[] { new MockResult(1, resultRecord) };
    }
};

final DSLContext mockedDSL = DSL.using(new MockConnection(myMockProvider), SQLDialect.ORACLE);

// here you go with your tests

我遇到过同样的问题,我不想 MockDataProvider,因为我正在测试 DAO 以外的东西。因此,我创建了一个简单的函数,以便将 Record(或多个)转换为 Result<T>

请注意,这是在 Kotlin 中,但应该很容易将其翻译成 Java:

val jooq = DSL.using(SQLDialect.POSTGRES)

fun <T : Record> result(table: TableImpl<T>, vararg data: T): Result<T> {
    return jooq.newResult(table).apply { addAll(data) }
}

然后可以按如下方式使用:

result(TABLE_NAME, <a record>, <another record>)

而且记录只能使用它们的构造函数来创建。