0

我使用SQL的行家-插件設置一個在存儲器HSQL數據庫單元測試HSQL單元測試行家

 <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>sql-maven-plugin</artifactId> 
      <version>1.5</version> 
      <dependencies> 
       <dependency> 
        <groupId>org.hsqldb</groupId> 
        <artifactId>hsqldb</artifactId> 
        <version>2.2.8</version> 
       </dependency> 
      </dependencies> 
      <executions> 
       <execution> 
        <id>create-db</id> 
        <phase>process-test-resources</phase> 
        <goals> 
         <goal>execute</goal> 
        </goals> 
        <configuration> 
         <driver>org.hsqldb.jdbcDriver</driver> 
         <url>jdbc:hsqldb:mem:test;shutdown=false</url> 
         <username>SA</username> 
         <password></password> 
         <autocommit>true</autocommit> 
         <srcFiles> 
          <srcFile>src/test/sql/test_db/test.sql</srcFile> 
         </srcFiles> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

在於,在行家運行單元測試:測試階段,我實例化與該數據源url

  org.hsqldb.jdbc.JDBCDataSource ds = new JDBCDataSource(); 
      ds.setUrl(URL); 
      ds.setUser("sa"); 
      ds.setPassword(""); 

但這並沒有我通過腳本初始化的表。事實證明,surefire會派生出一個新的jvm,並且不能從那裏訪問啓動的原始hsql實例。有沒有一個解決方案沒有引入文件支持hsqldb?

感謝

回答

0

你有沒有考慮過使用dbunit?這也使得從IDE開始運行單元測試變得容易很多,而不需要Maven或執行其所有的預測階段。

此外,對於單元測試是使用一個數據庫需要它?你不應該測試是否可以建立數據庫連接。相反,我寧願用mockito這樣的東西來模擬這樣的對象。這是關於指定某個sql語句所需的結果。

+0

謝謝,您的建議,但我需要的是那種SQL有效性檢查。我有很多動態構建的sqls(大量的StringBuilder.appends),並希望通過針對數據庫運行來檢查生成的sqls的有效性。我認爲dbunit會減輕表/結果集的比較,但是在這種情況下它會有幫助嗎? – mzzzzb

+0

對於StringBuilder.appends非常非常小心,您可以引入SQL注入選項(https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet)。 DBUnit通常用於使數據庫處於特定狀態(預填表),因此您可以輕鬆地進行測試,就好像您正在使用生產數據庫一樣。 http://dbunit.sourceforge.net/howto.html –

0

你可以嘗試turning off forking in surefire

 <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.16</version> 
     <configuration> 
      <forkCount>0</forkCount> 
     </configuration> 
     </plugin> 

或者,你可以直接在單元測試環境中實例化HSQL服務器,這樣HSQL是分叉神火JVM中產生了:

@BeforeClass 
public static void oneTime() throws Exception { 
    org.hsqldb.Server.main(new String[]{}); 
} 

@AfterClass 
public static void oneTime() throws Exception { 
    BasicDataSource dataSource = ... // get your data source 
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 
    jdbcTemplate.execute("SHUTDOWN"); 
} 

後,如果您不關閉HSQL測試類,你會遇到「Port already in use」類型錯誤,試圖爲每個測試類生成一個新的數據庫服務器。

或者,你可以使用類似Hibernate或者DbUnit的框架。