2016-03-06 166 views
3

我正在使用帶有JDBI和h2-in-memory的Dropwizard框架來進行測試。另外我寫了我的DAO,現在我想用單元測試來測試它們。我來到了似乎符合我的要求的DBUnit。如何使用H2內存數據庫測試JDBI DAO?

但是如何將它與JDBI整合並填充測試數據呢?

回答

6

我實現這樣的:

我創建了一個基礎的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(); 
      } 
+0

是的,謝謝!這就是我一直在尋找的東西。但爲了測試目的,我想用我的測試數據填充我的測試數據庫(以測試GET方法),我的目標是使我的測試獨立於彼此。有沒有一種優雅的方式來填補我的數據庫模型類而不是手動查詢jdbi數據庫? – VanDavv

+0

嗨,請參閱編輯您的數據庫中的初始化數據 – pandaadb

+0

您的代碼無法正常工作。 'IOUtils.copy(resourceStream,writer);' - 這是不正確的 'super.setupTests();' - 哪個類是你擴展的? – VanDavv

相關問題