【发布时间】:2020-09-16 07:11:03
【问题描述】:
我正在编写单元测试以使用 JOOQ 库从 Oracle DB 获取记录,我需要模拟 DSLContext 的 fetch() 函数返回的数据。如何创建示例 Result<Record> 以由模拟函数返回?我用谷歌搜索了几个小时,但找不到答案。
【问题讨论】:
我正在编写单元测试以使用 JOOQ 库从 Oracle DB 获取记录,我需要模拟 DSLContext 的 fetch() 函数返回的数据。如何创建示例 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>)
并且可以使用它们的构造函数来创建记录。
【讨论】: