正在测试我在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
答案 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无法实例化
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中的区域和语言设置。