2017-09-25 14 views
0

H2 SQLデータベースで統合テストを実行しているときに定義されていないJavaコードから呼び出されるユーザー定義関数がMS SQL Serverにあります。私のコードはthe previous questionにあります。DbUnit - JdbcSQLException:関数 "*"が見つかりません

テストコード:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {H2Config.class}) 
@TestExecutionListeners({ 
     DependencyInjectionTestExecutionListener.class, 
     DbUnitTestExecutionListener.class, 
     TransactionalTestExecutionListener.class 
}) 
@TransactionConfiguration(defaultRollback = true) 
public class TableDaoTest { 

    @Autowired 
    private TableDao tableDao; 

    @Test 
    @DatabaseSetup("/datasets/import.xml") 
    public void testMethod01() { 
     tableDao.getRecordsByGroup(); 
     ... 

データベーススキーマは、Hibernateが自動生成されます。ご覧のように、テスト用のデータは、xmlデータセットを使用してDbUnitによって生成されます。また、MS SQLサーバーDBに存在する機能がH2データベースで定義されていないため、このテストは失敗します。

アプリケーションログ:DbUnitをテストする前に関数を作成/インポートする方法

Caused by: org.hibernate.exception.GenericJDBCException: could not prepare statement 
    ... 
Caused by: org.h2.jdbc.JdbcSQLException: Function "SAFE_MOD" not found; SQL statement: 
    select table10_.id, table10_.value, ... from Table1 table10_ where table10_.group1=dbo.safe_mod(?, ?); 
    ... 

答えて

0

H2データベースは、ユーザー定義のSQL関数をサポートしていません。ただし、このデータベースでは、Java関数をストアドプロシージャとしても使用できます。

@SuppressWarnings("unused") 
public class H2Function { 
    public static int safeMod(Integer n, Integer divider) { 
     if (divider == null) { 
      divider = 5000; 
     } 

     return n % divider; 
    } 

} 

静的Javaメソッドのみがサポートされていることに注意してください。クラスとメソッドの両方が公開されている必要があります。

Java関数は、それが使用する前にCREATE ALIAS ... FORを呼び出すことによって、(データベースに登録)宣言する必要があります。

CREATE ALIAS IF NOT EXISTS safe_mod DETERMINISTIC FOR "by.naxa.H2Function.safeMod"; 

私は、接続の初期化SQLの中に置くことにしましたので、この文は、すべてのテストの前に実行する必要があります:

@Bean 
public DataSource dataSource() { 
    BasicDataSource dataSource = new BasicDataSource(); 

    dataSource.setDriverClassName("org.h2.Driver"); 
    dataSource.setUrl("jdbc:h2:mem:my_db_name"); 
    dataSource.setUsername("sa"); 
    dataSource.setPassword(""); 
    dataSource.setConnectionInitSqls(Collections.singleton(
     "CREATE ALIAS IF NOT EXISTS safe_mod DETERMINISTIC FOR \"by.naxa.H2Function.safeMod\";")); 

    return dataSource; 
} 
関連する問題