2012-04-20 6 views
2

私は現在、単体テストを試みているいくつかの方法があります。これらのメソッドは、Spring JdbcTemplatesを使用してDB2 v8に対して正常に動作しています。H2(DB2モードで)を実行しているときのDB2構文(制限とダーティリード)

各SQLでは、文に「WITH UR」を追加することで、「ダーティー読み取り」が可能です。 また、それらのうちのいくつかは、 "最初の1行を取り出す"。

これは実際のDB2に対してうまく動作しますが、これらのメソッドをインメモリ・データベースに対してユニット・テストする必要があります。これはH2が入る場所です。

"WITH UR"と "FETCH FIRST .."を削除するとすべてうまく動作しますが、メソッドを変更する必要はなく、単純にバックエンドデータベースを変更します。

私が見る限り、これはH2を使用して直接使用することはできません。構文は異なります(ただし、MODE = DB2を使用します)。

さて、どうしたらいいですか?別のインメモリデータベースを使用する必要がありますか?私は方法を変更したり、 "テスト"機能/ハッキングを追加したくないので、それは無駄です。

アイデアも同様に高く評価されています。その私や何場合

EDIT

は私はわからないんだけど、私は次のエラーを取得します。注意すると、私はSpring 3.1とH2 1.3.166を使用しており、データベースのURLは "jdbc:h2:〜/ testdb; MODE = DB2"です。私が実行している場合、SQLはH2コンソールで動作するため、それが失敗した理由は分からないではなく、私のユニットテスト(壊れているのではないH2を推測)から:誰もが持っている場合は

Tests run: 3, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.109 sec <<< FAILURE! 
getAdvisor(impl.AdvisorServiceDaoImplTest) Time elapsed: 0.078 sec <<< ERROR! 
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT * FROM ADVISOR FETCH FIRST 1 ROWS ONLY ]; nested exception is org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "SELECT * FROM ADVISOR FETCH[*] FIRST 1 ROWS ONLY "; SQL statement: 
SELECT * FROM ADVISOR FETCH FIRST 1 ROWS ONLY [42000-166] 
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:233) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:637) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:662) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:702) 
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:178) 
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:185) 
    at impl.AdvisorServiceDaoImpl.getAdvisor(AdvisorServiceDaoImpl.java:150) 
    at impl.AdvisorServiceDaoImplTest.getAdvisor(AdvisorServiceDaoImplTest.java:69) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) 
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62) 
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140) 
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127) 
    at org.apache.maven.surefire.Surefire.run(Surefire.java:177) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:338) 
    at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:997) 
Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "SELECT * FROM ADVISOR FETCH[*] FIRST 1 ROWS ONLY "; SQL statement: 
SELECT * FROM ADVISOR FETCH FIRST 1 ROWS ONLY [42000-166] 
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:329) 
    at org.h2.message.DbException.get(DbException.java:169) 
    at org.h2.message.DbException.get(DbException.java:146) 
    at org.h2.message.DbException.getSyntaxError(DbException.java:181) 
    at org.h2.command.Parser.getSyntaxError(Parser.java:484) 
    at org.h2.command.Parser.prepareCommand(Parser.java:233) 
    at org.h2.engine.Session.prepareLocal(Session.java:415) 
    at org.h2.engine.Session.prepareCommand(Session.java:364) 
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1111) 
    at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:71) 
    at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:266) 
    at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.createPreparedStatement(PreparedStatementCreatorFactory.java:245) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:581) 
    ... 40 more 

EDIT#2 ここで同じ問題が私が知ったものです。私は、次の使っていた。

<jdbc:embedded-database id="dataSource" type="H2"> 
    <jdbc:script location="classpath:sql/create_schemas.sql"/> 
    <jdbc:script location="classpath:sql/create_tables.sql"/> 
    <jdbc:script location="classpath:sql/create_test_data.sql"/> 
</jdbc:embedded-database> 

これは、春は私の設定が失われたため、一般的な豆を使用してデータ・ソースを再インスタンス化することを意味します。 (私の場合)ソリューションは、単純に次のようにプログラムでデータベースをロードすることでした:あなたは何ができるか

EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); 
EmbeddedDatabase db = builder.setName("salgdb").setType(EmbeddedDatabaseType.H2) 
      .addScript("sql/create_schemas.sql") 
      .addScript("sql/create_tables.sql") 
      .addScript("sql/create_test_data.sql") 
       .build(); 
+0

"FETCH FIRST 1 ROWS ONLY"はH2で動作するはずです...実行しているクエリと使用しているH2のバージョンを投稿できますか?ただし、「WITH UR」は現在サポートされていません。 –

+0

奇妙な、動作していないようでした - 再び試してみる必要がありますね。 「WITH UR」について何をすべきですか?何か案は? – sunlock

+0

私のバージョンは1.3.166ですが、動作していないようです。私は間違いを続ける。私はSpring JdbcTemplatesを使用していて、「悪いSQL文法」を投げます。 「FETCH FIRST!ROWS ONLY」を削除すると、魅力的なように機能します。 – sunlock

答えて

5

:-)「UR WITH」機能をサポートするために、H2データベースのためのパッチを提供しています

"FETCH FIRST 1 ROWS ONLY"はH2の最新バージョンでは既に動作していますが、DB2モードでのみ動作します。

jdbc:h2:~/data/test;mode=db2 

例:

create table customer(id int); 
select * from customer fetch first 1 rows only; 

私はH2バージョン1.3.166でこれをテストしているが、それはまた、古いで動作するはずでとしてDB2モードを有効にするには、データベースのURLに;MODE=DB2を追加バージョン1.3.161以降の可能性があります。春の外にそれをテストするには:jdbc:h2:~/temp/testdb;MODE=DB2

  • 実行文:

    create table ADVISOR(id int);

    • ダウンロードH2
    • 実行H2コンソールツール
    • 使用するデータベースのURL http://h2database.comから

      SELECT * FROM ADVISOR FETCH FIRST 1 ROWS ONLY;

    これを行うと例外はありません。

  • +0

    私はソースを見てきました、そして、それはもっと大きな仕事のように思えます。いいですが:) – sunlock

    +0

    おそらく問題はあなたがH2の古いバージョンを使用しているということですか?私は自分の答えを更新しました。 –

    +0

    私の質問が更新されました。 H2、42000-166からこのエラーが出ますが、Googleは役に立ちません。 – sunlock

    1

    バージョン1.3.175以降、H2は「WITH UR」もサポートする必要があります。 H2 changelog

    +0

    これは素晴らしいニュースです! – sunlock

    関連する問題