You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对JOOQ中两个TableImpl的查询结果进行单元测试?

如何用DSL创建Result<Record2<ParentRecord,ChildRecord>>类型的测试结果?

背景

我有两张表:

CREATE TABLE PARENT ();
CREATE TABLE CHILD ();

通过自动生成代码,得到如下jOOQ查询:

create.select(
    PARENT,
    CHILD)
  .from(PARENT).join(CHILD).on(...);

该查询返回Result<Record2<ParentRecord,ChildRecord>>类型结果。我在编写单元测试解析结果时,无法创建匹配类型的结果,DSL.newResult()没有合适的重载方法。我尝试过以下代码,但要么无法编译,要么生成的记录类型不匹配:

DSL.newResult(PARENT,CHILD);
DSL.newResult(ParentRecord,ChildRecord);
DSL.newResult(Stream.concat(PARENT.fieldStream(),CHILD.fieldStream()).toList());

解决方法

要创建Result<Record2<ParentRecord,ChildRecord>>类型的测试结果,可按以下步骤操作:

1. 构建单个Record2实例

先手动创建并赋值ParentRecord和ChildRecord对象,再组合成Record2:

// 初始化ParentRecord并设置字段值
ParentRecord parent = new ParentRecord();
// parent.setXXX(xxx); 示例:parent.setId(1);

// 初始化ChildRecord并设置字段值
ChildRecord child = new ChildRecord();
// child.setXXX(xxx); 示例:child.setParentId(1);

// 创建Record2实例,传入jOOQ配置(测试中可快速构建,如DSL.using(SQLDialect.H2))
Record2<ParentRecord, ChildRecord> record = DSL.using(configuration).newRecord(PARENT, CHILD);
record.value1(parent);
record.value2(child);

2. 组装Result集合

基于上述Record2实例,创建并填充Result集合:

// 创建空的Result容器
Result<Record2<ParentRecord, ChildRecord>> result = DSL.using(configuration).newResult(PARENT, CHILD);
// 添加Record2实例到结果集
result.add(record);

3. 显式指定泛型解决编译问题

如果直接调用DSL.newResult(PARENT, CHILD)编译失败,可显式指定泛型类型:

Result<Record2<ParentRecord, ChildRecord>> result = 
    DSL.<Record2<ParentRecord, ChildRecord>>newResult(configuration, PARENT, CHILD);

4. 直接初始化ResultImpl(可选)

若需要更直接的方式,可使用jOOQ内部的ResultImpl类(单元测试场景下使用无问题):

Result<Record2<ParentRecord, ChildRecord>> result = new ResultImpl<>(
    DSL.using(configuration).meta().fields(PARENT.fields()).add(CHILD.fields()).get(),
    configuration
);
result.add(record);

内容的提问来源于stack exchange,提问作者kingrich1234

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 08:43:11