无法实例化LocalCloudDatastoreV1Service

时间:2015-09-15 08:37:56

标签: google-app-engine gradle google-cloud-datastore

正在测试我在Google App Engine模块中的一个类中使用的方法 在android工作室。我正在使用junit。

问题

当我尝试运行我的测试类时,这是我得到的错误

java.util.ServiceConfigurationError: com.google.appengine.tools.development.LocalRpcService: Provider com.google.appengine.api.datastore.dev.LocalCloudDatastoreV1Service could not be instantiated
at java.util.ServiceLoader.fail(ServiceLoader.java:232)
at java.util.ServiceLoader.access$100(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:384)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
at com.google.appengine.tools.development.ApiProxyLocalImpl.startServices(ApiProxyLocalImpl.java:604)
at com.google.appengine.tools.development.ApiProxyLocalImpl.access$700(ApiProxyLocalImpl.java:46)
at com.google.appengine.tools.development.ApiProxyLocalImpl$2.run(ApiProxyLocalImpl.java:588)
at com.google.appengine.tools.development.ApiProxyLocalImpl$2.run(ApiProxyLocalImpl.java:585)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.appengine.tools.development.ApiProxyLocalImpl.getService(ApiProxyLocalImpl.java:584)
at com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.callInternal(ApiProxyLocalImpl.java:500)
at com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.call(ApiProxyLocalImpl.java:479)
at com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.call(ApiProxyLocalImpl.java:456)
at java.util.concurrent.Executors$PrivilegedCallable$1.run(Executors.java:533)
at java.security.AccessController.doPrivileged(Native Method)
at java.util.concurrent.Executors$PrivilegedCallable.call(Executors.java:530)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

我用谷歌搜索了2天试图解决这个问题,但都是徒劳的

我应该采取什么来解决这个问题?

更新

我的Android项目有三个模块 A B C 。我在测试一个java类 的 c取代; SRC>试验> Java和GT; BXC> BxcTest.java

我创建了一个名为 BXC 的测试文件夹,我的班级位于

//This is saved in onther class that am accessing in BxcTest.java
 @Entity
public class Presidents{
@Id Long id;
String name;
int age;

public Presidents(Long pId, String pName, int pAge){
id = pId;
name = pName
age = pAge;
}

}

以下是我的 BxcTest.java 的样子

public class BxcTest {
static{
ObjectifyService.register(Presidents.class);
}
private final LocalServiceTestHelper helper =
        new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());


@Before
public void setUp() {
    helper.setUp();
}


@Test
public void methodUnderTest() throws Exception {
//my code under test
Presidents p1 = new Presidents(new Long(1),Daniel,88);
Presidents p2 = new Presidents(new Long(2),Mwai,81);
Presidents p3 = new Presidents(new Long(3),Daniel,70);
ofy().save().entities.(p1,p2,p3).now();

}

@After
public void tearDown() {
    helper.tearDown();
}
}

更新2.由

引起的错误
Caused by: java.lang.IllegalAccessError: tried to access field com.google.appengine.repackaged.com.google.storage.onestore.v3.proto2api.OnestoreEntity$CompositeIndex.PARSER from class com.google.apphosting.datastore.shared.DatastoreProtoConverter
at com.google.apphosting.datastore.shared.DatastoreProtoConverter.<clinit>(DatastoreProtoConverter.java:62)
at com.google.appengine.api.datastore.dev.LocalCloudDatastoreV1Service.<clinit>(LocalCloudDatastoreV1Service.java:107)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)


Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.google.appengine.api.datastore.dev.LocalCloudDatastoreV1Service
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at java.lang.Class.newInstance(Class.java:442)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:380)

更新3

这是我的modlue的.gradle文件

// If you would like more information on the gradle-appengine-plugin   please refer to the github page
// https://github.com/GoogleCloudPlatform/gradle-appengine-plugin

buildscript {
repositories {
    jcenter()
}
dependencies {
    classpath 'com.google.appengine:gradle-appengine-plugin:1.9.14'
}
}

repositories {
jcenter();
}

apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'appengine'

sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile fileTree(dir: 'testLibs', include: ['*.jar'])
appengineSdk 'com.google.appengine:appengine-java-sdk:1.9.14'
compile 'com.google.appengine:appengine-endpoints:1.9.14'
compile 'com.google.appengine:appengine-endpoints-deps:1.9.14'
compile 'com.googlecode.objectify:objectify:5.0.3'
compile 'javax.servlet:servlet-api:2.5'
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.9.5'
compile 'org.apache.httpcomponents:httpcomponents-client:4.4.1'
compile 'org.apache.httpcomponents:httpmime:4.4.1'
compile 'org.apache.httpcomponents:fluent-hc:4.4.1'
compile 'org.apache.httpcomponents:httpclient-cache:4.4.1'
testCompile 'org.json:json:20141113'
testCompile 'com.google.appengine:appengine-testing:1.9.21'
testCompile 'com.google.appengine:appengine-api-stubs:1.9.21'
testCompile 'com.google.appengine:appengine-api-labs:1.9.21'
testCompile 'com.google.appengine:appengine-api-1.0-sdk:1.9.21'
compile 'org.json:json:20140107'
compile 'com.google.appengine.tools:appengine-gcs-client:0.4.4'
compile 'org.igniterealtime.smack:smack:3.2.1'
}

appengine {
downloadSdk = true
appcfg {
    oauth2 = true
}
endpoints {
    getClientLibsOnBuild = true
    getDiscoveryDocsOnBuild = true
}
jvmFlags = ["-Ddatastore.backing_store=${rootDir}/data_store /local_db.bin".toString()]
}

task myCopyTask << {

copy {
    from 'src/main/assets'
    into 'build/exploded-app/assets'
}

copy {
    from '../keys'
    into 'build/exploded-app/keys'
}

copy {
    from '../cybs.properties'
    into 'build/exploded-app'
}
}

appengineRun.dependsOn myCopyTask

3 个答案:

答案 0 :(得分:1)

好的,我们来看看吧!

首先,你的测试并不好。 如需一个好的示例代码,请点击以下链接: ConferenceApiGlobalQueryTest.java

其次,你应该清理你的gradle.build文件。 请尝试以下依赖项:

dependencies {
    appengineSdk 'com.google.appengine:appengine-java-sdk:1.9.24'
    compile 'com.google.appengine:appengine-api-1.0-sdk:1.9.24'
    compile 'com.google.appengine:appengine-endpoints:1.9.24'
    compile 'com.google.appengine:appengine-api-labs:1.9.24'

    compile 'com.googlecode.objectify:objectify:5.0.3'

    compile 'javax.servlet:servlet-api:2.5'
    compile 'javax.inject:javax.inject:1'

    testCompile 'com.google.appengine:appengine-testing:1.9.24'
    testCompile 'com.google.appengine:appengine-api-stubs:1.9.24'
    testCompile 'junit:junit:4.12'
}

如果构建编译器时告诉您缺少一个包,只需将其添加回build.gradle,然后再次尝试构建。对您而言,一个不错的选择就是评论上面未列出的那些包。

答案 1 :(得分:1)

在sam-dw的帮助下,我终于按照示例@ ConferenceApiGlobalQueryTest.java进行了后端junit测试。

这是我为解决所有问题而采取的步骤,包括 LocalCloudDatastoreV1Service无法实例化

  • mvnrepository.com
  • 下载了所需的所有 .jar 文件(请参阅下面的build.gradle文件,了解所需的jar文件
  • 在我的模块中创建了 libs testLibs 文件夹(如果GAE模块中已经存在,则不必这样做。)
  • jar 文件粘贴到相应的文件夹中。即测试所需的那些我把它们放在 testLibs 和编译目的所需的那些我把它们放在 libs 文件夹中。
  • 之后,我右键单击我文件夹中的 jar 文件,然后从弹出菜单中选择添加为库,android studio将它们添加为我的模块库。
  • Android Studio将我的jar文件添加为库后,所有compile files('testLibs/xxxx.jar')compile files('libs/xxxx.jar')都自动出现在我的后端模块的build.gradle文件中(所以不要尝试)
  • 之后,我右键单击我的测试类BxcTest并运行它。我得到了预期的结果。

    我的模块的build.gradle文件

    buildscript {
    repositories {
    jcenter()
    }
    dependencies {
    classpath 'com.google.appengine:gradle-appengine-plugin:1.9.18'
    }
    }
    
     repositories {
     jcenter();
     }
    
     apply plugin: 'java'
     apply plugin: 'war'
     apply plugin: 'appengine'
    
     sourceCompatibility = JavaVersion.VERSION_1_7
     targetCompatibility = JavaVersion.VERSION_1_7
     dependencies{
    compile files('testLibs/junit-4.12.jar')
    compile files('testLibs/hamcrest-library-1.3.jar')
    compile files('testLibs/appengine-api-stubs-1.9.18.jar')
    compile files('testLibs/appengine-api-labs-1.9.18.jar')
    compile files('testLibs/appengine-testing-1.9.18.jar')
    compile files('testLibs/appengine-tools-sdk-1.9.18.jar')
    compile files('libs/appengine-endpoints-1.9.18.jar')
    compile files('testLibs/hamcrest-core-1.3.jar')
    
    appengineSdk 'com.google.appengine:appengine-java-sdk:1.9.18'
    compile 'com.google.appengine:appengine-endpoints:1.9.18'
    compile 'com.google.appengine:appengine-endpoints-deps:1.9.18'
    compile 'javax.servlet:servlet-api:2.5'
    compile 'com.googlecode.objectify:objectify:5.0.3'
    
    testCompile 'junit:junit:4.12'
    testCompile 'com.google.appengine:appengine-testing:1.9.18'
    testCompile 'com.google.appengine:appengine-api-labs:1.9.18'
    testCompile 'com.google.appengine:appengine-api-stubs:1.9.18'
    testCompile 'com.google.appengine:appengine-tools-sdk:1.9.18'
    testCompile 'org.hamcrest:hamcrest-core:1.3'
    }
    
    appengine {
    downloadSdk = true
    appcfg {
    oauth2 = true
    }
    endpoints {
    getClientLibsOnBuild = true
    getDiscoveryDocsOnBuild = true
    }
    }
    

我的实体类

import com.googlecode.objectify.Key;
import com.googlecode.objectify.ObjectifyService;
import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
import com.googlecode.objectify.annotation.Index;
import com.googlecode.objectify.annotation.Parent;


@Entity
public class President {

@Id Long id;
@Parent Key<President> group;

@Index
String name;

int age;

static{
    ObjectifyService.register(Presidents.class);
}

 public President(Long pId, String pName, int pAge, String group){
    id = pId;
    name = pName;
    age = pAge;
    this.group = Key.create(Presidents.class,group);
 }

 public String getName(){
    return name;
 }

 public Long getId(){
    return id;

}
}

我的班级要测试。(总统p3是我目前的肯尼亚总统:))

import com.example.gikarasojo.myapplication.backend.Presidents;

import static com.googlecode.objectify.ObjectifyService.ofy;

public class Bxc {

 public void savingLeaders(){
    President p1 = new Presidents(new Long(1),"Daniel Moi",88,"president");
    President p2 = new Presidents(new Long(2),"Mwai Kibaki",81,"President");
    President p3 = new Presidents(new Long(3),"Uhuru Kenyatta",70,"President");
    ofy().save().entities(p1,p2,p3).now();

}
}

我的JUnit测试(建议将junit测试类放在不同的包中。例如在主包中创建一个新包。只需右键单击你的包并选择新的&gt;包(这是在android studio中) )

package com.example.gikarasojo.myapplication.backend.Tests;

import com.example.gikarasojo.myapplication.backend.Presidents;
import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
 import com.google.appengine.tools.development.testing.LocalServiceTestHelper;

import static com.googlecode.objectify.ObjectifyService.ofy;
import static org.junit.Assert.*;


public class BxcTest {

private final LocalServiceTestHelper helper =
        new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());

President p1,p2,p3;

@org.junit.Before
public void setUp() throws Exception {
    helper.setUp();
     p1 = new President(new Long(1),"Daniel",88,"president");
     p2 = new President(new Long(2),"Mwai",81,"President");
     p3 = new President(new Long(3),"Daniel",70,"President");
    ofy().save().entities(p1,p2,p3).now();
    System.out.println("Successfully saved.");
 }

 @org.junit.After
 public void tearDown() throws Exception {
  ofy().clear();
    helper.tearDown();
 }

@org.junit.Test
public void testSavingLeaders() throws Exception {
 President pres1 = ofy().load().type(President.class).filter("name","Mwai").first().now();
    System.out.println("President name is: "+ pres1.getName()+ "His id is: "+pres1.getId());
 }
}

长期的输出!

President name is: Daniel his id is: 1

答案 2 :(得分:0)

如果您收到LocalCloudDatastoreV4Service无法实例化Eclipse中的ServiceConfigurationError检查您在Windows中的区域和语言设置。