使用JOOQ创建用于测试的数据库

时间:2014-03-29 10:30:30

标签: java sql testing jooq

首先,JOOQ非常棒,为我节省了更多时间。最近我一直在考虑使用JOOQ进行测试,并且有一个很棒的MockResult和相关类来模拟DB的结果。但是,当然,测试数据库层的一个挑战是,您必须知道查询是否真正有效。

作为JOOQ,在生成类时,是否有效地获取了数据库的快照,为什么我们不能使用它来重新创建数据库进行测试?例如,在内存DB中启动并运行createDatabase()或getTableSql()类型命令。所以我的问题是,是否有人知道JOOQ可以实现的方式?

通过这样的设置,JOOQ可以传授它对DB结构的了解,虽然减去索引和其他细节,然后可以测试查询。当然我有数据库部署脚本,但这将允许纯粹的基于Java的解决方案。毕竟,如果数据库发生了变化,你还是需要重新生成JOOQ,所以为什么不在那个快照中工作呢。

除此之外,我已经有了一个checkDatabase()命令,该命令在应用程序启动时运行,循环遍历JOOQ表和字段以验证它们是否都存在,如果部署应用程序的环境不匹配则抛出异常拍摄的最后一张JOOQ快照。

1 个答案:

答案 0 :(得分:3)

问题#3160已针对jOOQ 3.8实施

有了这个,你可以运行(例如):

for (Query query : 
    DSL.using(SQLDialect.H2, new Settings().withRenderFormatted())
       .ddl(T_BOOK)
       .queries()) {
    System.out.println(query + ";\n");
}

...将打印(例如):

create table "PUBLIC"."T_BOOK"(
  "ID" int not null,
  "AUTHOR_ID" int not null,
  "CO_AUTHOR_ID" int null,
  "DETAILS_ID" int null,
  "TITLE" varchar(400) not null,
  "PUBLISHED_IN" int not null,
  "LANGUAGE_ID" int not null,
  "CONTENT_TEXT" clob null,
  "CONTENT_PDF" blob null,
  "REC_VERSION" int null,
  "REC_TIMESTAMP" timestamp null,
  constraint "PK_T_BOOK"
    primary key ("ID"),
  constraint "FK_T_BOOK_AUTHOR_ID"
    foreign key ("AUTHOR_ID")
    references "PUBLIC"."T_AUTHOR" ("ID"),
  constraint "FK_T_BOOK_CO_AUTHOR_ID"
    foreign key ("CO_AUTHOR_ID")
    references "PUBLIC"."T_AUTHOR" ("ID"),
  constraint "FK_T_BOOK_LANGUAGE_ID"
    foreign key ("LANGUAGE_ID")
    references "PUBLIC"."T_LANGUAGE" ("ID")
);