java - 使用 Maven 进行 Google App Engine 数据存储单元测试

标签 java google-app-engine unit-testing datanucleus

尝试使用 maven 3.2.1 运行我的 GAE 1.9.0 项目的单元测试。数据存储相关测试失败:

java.util.ServiceConfigurationError: 
com.google.appengine.tools.development.LocalRpcService: 
Provider com.google.appengine.api.datastore.dev.LocalDatastoreV4Service 
could not be instantiated: java.lang.NoClassDefFoundError: 
com/google/apphosting/datastore/DatastoreV4$LookupRequestOrBuilder

我明白这意味着我缺少依赖项。似乎无法找到有关如何为数据存储测试正确配置我的 pom.xml 的文档。调用时测试崩溃

helper.setup()

在助手上:

public final LocalServiceTestHelper helper = new LocalServiceTestHelper(
            new LocalDatastoreServiceTestConfig(),
            new LocalTaskQueueTestConfig(),
            new LocalBlobstoreServiceTestConfig(),
            new LocalUserServiceTestConfig()));

引用:

https://developers.google.com/appengine/docs/java/tools/maven#junit_dependencies_optional

https://developers.google.com/appengine/docs/java/tools/localunittesting#Java_Writing_Datastore_and_memcache_tests

我的 pom.xml 中的测试依赖项

       <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-testing</artifactId>
            <version>${appengine.target.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-api-stubs</artifactId>
            <version>${appengine.target.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-api-labs</artifactId>
            <version>${appengine.target.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>3.2.1.RELEASE</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>spring</groupId>
            <artifactId>spring-mock</artifactId>
            <version>1.0.2</version>
            <scope>test</scope>
        </dependency>

堆栈跟踪的其余部分:

at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
        at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
        at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
        at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
        at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
    Caused by: java.lang.NoClassDefFoundError: com/google/apphosting/datastore/DatastoreV4$LookupRequestOrBuilder
        at java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.lang.Class.privateGetDeclaredConstructors(Class.java:2493)
        at java.lang.Class.getConstructor0(Class.java:2803)
        at java.lang.Class.newInstance(Class.java:345)
        at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:373)
        ... 42 more
    Caused by: java.lang.ClassNotFoundException: com.google.apphosting.datastore.DatastoreV4$LookupRequestOrBuilder
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)

最佳答案

在我的例子中,将 testCompile 'com.google.appengine:appengine-tools-sdk:1.9.24' 添加到我的 build.gradle 修复了它。 (我正在使用 gradle - maven 等效项应该是相同的。)这是我的测试依赖项:

// Test
testCompile "junit:junit:4.12"
testCompile 'com.google.appengine:appengine-testing:1.9.24'
testCompile 'com.google.appengine:appengine-api-labs:1.9.24'
testCompile 'com.google.appengine:appengine-api-stubs:1.9.24'
testCompile 'com.google.appengine:appengine-tools-sdk:1.9.24'

我不知道发生了什么变化 - 它过去在没有这种依赖性的情况下工作。但至少可以解决问题。

关于java - 使用 Maven 进行 Google App Engine 数据存储单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22153843/

相关文章:

java - 推特中的 Stream API 没有响应

java - EJBObject 在客户端之间共享?

java - 如何使用 maven 更改在 GAE 中上传的项目?

unit-testing - 如何更改 OCMock stub 的返回值?

javascript - 有没有办法在 node.js 中出现异常或测试失败时启动调试器?

javascript - 如何使用squire模拟内联requirejs依赖项以进行单元测试?

java - Android 字符串与 EditText 字符串值的比较

java - 使用冲突的参数调用命令行应用程序

java - appengine-maven-plugin 配置选项,如 jvm 标志

javascript - Google App Engine 上的 Flash 外部接口(interface)问题