2012-10-02 13 views
2

在MySQL的数据库脱机工作正常,当我启动应用程序,但我想使它的工作也为我的单元测试!应用程序引擎 - 谷歌云SQL - 针对JUnit本地MySQL数据库 - RDBMS包未发现

但它告诉我,“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

我想我会响应我自己的问题,我发现身边做我想可以随意,如果你有一个更好的答案回应此

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"); 

    } 

不是最好的方式工作!

3

OK,我有这个同样的问题,终于能够得到它的工作。这是问题的一个总结:

  1. 如果你是实际的应用程序引擎内运行,或在本地App Engine的开发环境的com.google.appengine.api.rdbms.AppEngineDriver驱动程序才有效。当你在单元测试或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可以习惯:谷歌:RDBMS DB URL。

就我而言,我使用Maven,Spring和iBatis的。我的解决方案是,当运行测试用例时,我使用Spring的SimpleDriverDataSource。此数据源让您使用ACTUAL驱动程序实例,而不仅仅指定类名称。这意味着你不必担心你的classpath兼具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中还有其他的东西与我拥有的其他依赖项(一些杰克逊库)发生冲突,所以我只是将com.google包拉出到单独的jar中。然后我将这个jar添加到我在maven的依赖中,如下所示:https://devcenter.heroku.com/articles/local-maven-dependencies。然后我将它作为测试范围的项目添加到了我的项目中。

+0

com.google.cloud.sql.Driver - ClassNotFoundException。我没有在appengine-api-x.x-sdk-x.x.x..jar中看到它 – Jasper

相关问题