3
我正在使用帶有JDBI和h2-in-memory的Dropwizard框架來進行測試。另外我寫了我的DAO,現在我想用單元測試來測試它們。我來到了似乎符合我的要求的DBUnit。如何使用H2內存數據庫測試JDBI DAO?
但是如何將它與JDBI整合並填充測試數據呢?
我正在使用帶有JDBI和h2-in-memory的Dropwizard框架來進行測試。另外我寫了我的DAO,現在我想用單元測試來測試它們。我來到了似乎符合我的要求的DBUnit。如何使用H2內存數據庫測試JDBI DAO?
但是如何將它與JDBI整合並填充測試數據呢?
我實現這樣的:
我創建了一個基礎的DAO類,設置了我的DW的環境,搭建DBI比如我。這看起來像這樣:
@BeforeClass
public static void setup() {
env = new Environment("test-env", Jackson.newObjectMapper(), null, new MetricRegistry(), null);
dbi = new DBIFactory().build(env, getDataSourceFactory(), "test");
dbi.registerArgumentFactory(new JodaDateTimeArgumentFactory());
dbi.registerMapper(new JodaDateTimeMapper(Optional.absent()));
}
static DataSourceFactory getDataSourceFactory()
{
DataSourceFactory dataSourceFactory = new DataSourceFactory();
dataSourceFactory.setDriverClass("org.h2.Driver");
dataSourceFactory.setUrl("jdbc:h2:mem:testDb");
dataSourceFactory.setUser("sa");
dataSourceFactory.setPassword("");
return dataSourceFactory;
}
public static DBI getDbi() {
return dbi;
}
public static Environment getEnvironment() {
return env;
}
不是這樣會爲您創建一個指向您的內存數據庫的數據源。
沒有在實際測試中,你可以使用DBI實例的測試之前創建你的DAO:
DaoA dao;
DaoB otherDao;
@Before
public void setupTests() throws IOException {
super.setupTests();
dao = dbi.onDemand(DaoA.class);
otherDao = dbi.onDemand(DaoB.class);
}
有了這個你的好去,你就可以開始測試。希望有所幫助。
阿圖爾
編輯init的:
我的測試中初始化自己爲好。爲此我直接使用dbi來執行sql腳本。例如,測試與作爲測試類路徑資源的test1.sql腳本相關聯。在這種情況下,我需要做的就是讀取該腳本並在測試之前運行它。例如像這樣:
StringWriter writer = new StringWriter();
InputStream resourceStream = this.getClass().getResourceAsStream("/sql/schema.sql");
if(resourceStream == null) {
throw new FileNotFoundException("schema not found");
}
IOUtils.copy(resourceStream, writer);
Handle handle = null;
try {
handle = dbi.open();
handle.execute(writer.toString());
handle.commit();
} finally {
handle.close();
if(resourceStream != null) {
resourceStream.close();
}
writer.close();
}
是的,謝謝!這就是我一直在尋找的東西。但爲了測試目的,我想用我的測試數據填充我的測試數據庫(以測試GET方法),我的目標是使我的測試獨立於彼此。有沒有一種優雅的方式來填補我的數據庫模型類而不是手動查詢jdbi數據庫? – VanDavv
嗨,請參閱編輯您的數據庫中的初始化數據 – pandaadb
您的代碼無法正常工作。 'IOUtils.copy(resourceStream,writer);' - 這是不正確的 'super.setupTests();' - 哪個類是你擴展的? – VanDavv