当我启动应用程序时,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)
看来我不是唯一一个也有这个麻烦的人:
最佳答案
好的,我也遇到了同样的问题,终于能够让它工作了。以下是该问题的摘要:
- com.google.appengine.api.rdbms.AppEngineDriver 驱动程序仅在您在实际 App Engine 或本地 App Engine 开发环境中运行时才有效。当您仅在单元测试中或在 App Engine 之外运行时,它不起作用(给出“rdbms”包丢失错误)。即使您将 rdbms.driver 系统属性设置为其他值,情况也是如此。
- 可在非 App Engine java 进程中工作的驱动程序是 com.google.cloud.sql.Driver。
- 不幸的是,如果您使用 DriverManager.getConnection() 加载驱动程序(大多数数据源都会这样做),事情就会变得棘手。此方法查看已注册的驱动程序,以查看哪个驱动程序可以加载提供的 URL。因此,如果您同时注册 AppEngineDriver 和 com.google.cloud.sql.Driver,就会遇到麻烦 - 当您加载 jdbc:google:rdbms 数据库 URL 时,可能会使用“错误的驱动程序”。
就我而言,我使用 maven、Spring 和 iBatis。我的解决方案是,在运行测试用例时,我使用 Spring 的 SimpleDriverDataSource。此数据源允许您使用实际的驱动程序实例,而不仅仅是指定类名。这意味着您不必担心类路径中同时存在 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 中,位于 appengine-java-sdk-1.7.3/lib/impl/google_sql.jar。对我来说,google_sql.jar 中还有其他东西与我拥有的其他依赖项(一些 jackson 库)发生冲突,所以我只将 com.google 包取出到一个单独的 jar 中。然后,我将此 jar 添加到 Maven 中的依赖项中,如下所述:https://devcenter.heroku.com/articles/local-maven-dependencies 。然后我将其作为依赖项添加到我的具有测试范围的项目中。
关于mysql - App Engine - Google Cloud SQL - jUnit 的本地 MySQL 数据库 - 未找到 rdbms 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12697927/