2

MySQLのオフラインデータベースは、アプリを起動すると正常に機能していますが、単体テストでも機能するようにしたいと思います。

しかし、「rdbms」パッケージが欠落していることがわかります。

次の例外が発生したため、インポートなどが欠落している可能性があります。

java.lang.AssertionError: Exception = com.google.apphosting.api.ApiProxy$CallNotFoundException: The API package 'rdbms' or call 'OpenConnection()' was not found.
    at org.junit.Assert.fail(Assert.java:93)
    at testDb.DbUserUnitTestCase.testAdd(DbUserUnitTestCase.java:50)
    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.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    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.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.junit.runners.Suite.runChild(Suite.java:128)
    at org.junit.runners.Suite.runChild(Suite.java:24)
    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.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

私だけが問題を抱えているわけではないようです:

4

2 に答える 2

3

OK、私はこれと同じ問題を抱えていて、ついにそれを機能させることができました. 問題の概要は次のとおりです。

  1. com.google.appengine.api.rdbms.AppEngineDriver ドライバは、実際の App Engine 内またはローカルの App Engine 開発環境で実行している場合にのみ機能します。単体テストまたは App Engine の外部でのみ実行している場合は機能しません (この「rdbms」パッケージが見つからないというエラーが発生します)。これは、rdbms.driver システム プロパティを別の値に設定した場合にも当てはまります。
  2. App Engine 以外の Java プロセスで動作するドライバは、com.google.cloud.sql.Driver です。
  3. 残念ながら、DriverManager.getConnection() を使用してドライバーをロードしている場合 (ほとんどのデータソースがそうしています)、注意が必要です。このメソッドは、登録済みのドライバーを調べて、提供された URL をロードできるドライバーを確認します。したがって、AppEngineDriver と com.google.cloud.sql.Driver の両方を登録すると問題が発生します。jdbc:google:rdbms DB URL をロードするときに「間違ったもの」が使用される可能性があります。

私の場合、maven、Spring、iBatis を使用しています。私の解決策は、テスト ケースを実行するときに、Spring の SimpleDriverDataSource を使用することです。このデータ ソースでは、クラス名を指定するだけでなく、ACTUAL ドライバー インスタンスを使用できます。つまり、クラスパスに AppEngineDriver と com.google.cloud.sql.Driver の両方があることを心配する必要はありません。

<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
    <constructor-arg>
        <bean class="com.google.cloud.sql.Driver"/>
    </constructor-arg>
    <constructor-arg value="jdbc:google:rdbms://myProject:myInstance/myDb"/>
</bean>

また、com.google.cloud.sql.Driver は、標準の Maven アーティファクトのいずれにもパッケージ化されていないようです。代わりに、appengine-java-sdk-1.7.3/lib/impl/google_sql.jar の appengine-java-sdk に含まれています。私にとっては、google_sql.jar に、私が持っている他の依存関係 (いくつかの jackson ライブラリ) と衝突する他のものがあったため、代わりに com.google パッケージだけを別の jar に取り出しました。次に、 https ://devcenter.heroku.com/articles/local-maven-dependencies で説明されているように、この jar を maven の依存関係に追加しました。次に、これをテスト スコープのプロジェクトに依存関係として追加しました。

于 2012-12-07T03:31:53.603 に答える
1

私は自分の質問に答えるつもりだと思います、私はこれを行うための回避策を見つけました

    if(isUnitTesting) {

        String url = "jdbc:mysql://localhost:3306/project";

        connection = DriverManager.getConnection(url, "root","");

    } else {

        DriverManager.registerDriver(new AppEngineDriver());
        connection = DriverManager.getConnection("jdbc:google:rdbms://"+instanceName+"/project");

    }

私が推測する最善の方法ではないので、より良い答えがあれば遠慮なく返信してください!

于 2012-10-04T15:28:06.467 に答える