2014-03-29 45 views
2

首先,JOOQ非常棒,爲我節省了更多時間。最近我一直在用JOOQ進行測試,並且有一個很棒的MockResult和相關類來模擬數據庫的結果。但是當然,測試數據庫層的一個挑戰是在某些時候你必須知道查詢是否真正起作用。使用JOOQ創建一個數據庫進行測試

作爲JOOQ,在生成類時,實際上會爲您的數據庫創建一個快照,爲什麼我們不能使用它來重新創建數據庫進行測試?例如,在內存數據庫中創建一個並運行createDatabase()或getTableSql()類型的命令。所以我的問題是沒有人知道用JOOQ可以實現的方式嗎?

有了這樣的設置,JOOQ可以傳遞它對DB結構的知識,儘管減去索引和其他細節,然後可以測試查詢。當然,我有數據庫部署腳本,但這將允許一個純粹的基於Java的解決方案。畢竟,如果數據庫發生變化,無論如何您都需要重新生成JOOQ,爲什麼不能從該快照中運行。

除此之外,我已經有了一個checkDatabase()命令,它在應用程序啓動時運行,它通過JOOQ表和字段循環以驗證它們全部存在並在應用程序部署的環境中不會引發異常匹配拍攝的最後一個JOOQ快照。

回答

2

問題#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") 
); 
+0

謝謝盧卡斯。我會看看做出貢獻,因爲回饋是件好事。 – user3475493

+0

@ user3475493:太好了!我們期待着您的貢獻! –

相關問題