如何对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
相关产品推荐
相关产品推荐

