mysql - App Engine - Google Cloud SQL - jUnit 的本地 MySQL 数据库 - 未找到 rdbms 包

标签 mysql google-app-engine junit google-cloud-sql

当我启动应用程序时,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)

看来我不是唯一一个也有这个麻烦的人:

最佳答案

好的,我也遇到了同样的问题,终于能够让它工作了。以下是该问题的摘要:

  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 数据库 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/

相关文章:

MySQL : Group rows my multiple columns and return the count

java - 如何阻止 Hibernate 发送垃圾邮件日志

node.js - Google App Engine nodejs网站错误503

java - junit中assertTrue的第二个参数可以是字符串吗?

java - 使用多个并发线程执行一组测试方法

php - 运行 php 代码连接数据库时显示 fatal error

php - 如何在 hacklang/hhvm 中使用 Mysql PDO 驱动程序

java - 如何在 Java (Android) 中从 AppEngine 解析 DateTime 属性?

java - 如何通过另一个表值的文本单击复选框

php - MySQL 查询显示 PHP 中的错误