Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AppEngine Jersey Junit测试不工作(未为此线程注册api)_Java_Google App Engine_Jersey_Junit4 - Fatal编程技术网

Java AppEngine Jersey Junit测试不工作(未为此线程注册api)

Java AppEngine Jersey Junit测试不工作(未为此线程注册api),java,google-app-engine,jersey,junit4,Java,Google App Engine,Jersey,Junit4,我真的很难让泽西、阿彭金和朱尼特工作。当前错误如下: java.lang.NullPointerException: No API environment is registered for this thread. at com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppId(DatastoreApiHelper.java:86) at com.google.appengine.api.dat

我真的很难让泽西、阿彭金和朱尼特工作。当前错误如下:

java.lang.NullPointerException: No API environment is registered for this thread.
    at  com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppId(DatastoreApiHelper.java:86)
at     com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppIdNamespace(DatastoreApiHelper.java:96)
at com.google.appengine.api.datastore.Key.<init>(Key.java:106)
at com.google.appengine.api.datastore.Key.<init>(Key.java:90)
at com.google.appengine.api.datastore.Key.<init>(Key.java:86)
at com.google.appengine.api.datastore.Entity.<init>(Entity.java:125)
at com.google.appengine.api.datastore.Entity.<init>(Entity.java:106)
at org.datanucleus.store.appengine.DatastoreFieldManager.<init>(DatastoreFieldManager.java:189)
at  org.datanucleus.store.appengine.DatastorePersistenceHandler.insertPreProcess(DatastorePersistenceHandler.java:354)
at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObjects(DatastorePersistenceHandler.java:267)
at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:256)
at org.datanucleus.state.JDOStateManagerImpl.internalMakePersistent(JDOStateManagerImpl.java:3185)
at org.datanucleus.state.JDOStateManagerImpl.makePersistent(JDOStateManagerImpl.java:3161)
at org.datanucleus.ObjectManagerImpl.persistObjectInternal(ObjectManagerImpl.java:1298)
at org.datanucleus.ObjectManagerImpl.persistObject(ObjectManagerImpl.java:1175)
at org.datanucleus.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:669)
at org.datanucleus.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:694)
at com.acolsolutions.loyaltycard.dataobjects.CardDAO.create(CardDAO.java:23)
at com.acolsolutions.loyaltycard.resources.CardResource.create(CardResource.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1483)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1414)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1363)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1353)
at com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainer._service(GrizzlyContainer.java:215)
at com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainer.service(GrizzlyContainer.java:185)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:163)
at org.glassfish.grizzly.http.server.HttpHandlerChain.service(HttpHandlerChain.java:207)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:163)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:164)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:265)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:134)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:78)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:816)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:111)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:566)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:546)
at java.lang.Thread.run(Unknown Source)
import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;

import javax.ws.rs.core.UriBuilder;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;

import org.glassfish.grizzly.http.server.HttpServer;

import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.Client;

import org.codehaus.jettison.json.JSONObject;

public class CardResourceTests {
private final LocalServiceTestHelper helper = new LocalServiceTestHelper(
        new LocalDatastoreServiceTestConfig()); 

private HttpServer httpServer;
private URI uri;

@Before
public void setUp() throws Exception {
    helper.setUp();

    uri = UriBuilder.fromUri("http://localhost/").port(9998).build();
    ResourceConfig rc = new PackagesResourceConfig("com.acolsolutions.loyaltycard.resources");
    httpServer = GrizzlyServerFactory.createHttpServer(uri, rc);
}

@After
public void tearDown() throws Exception {
    helper.tearDown();

    httpServer.stop();
}

@Test
public void testCreate() {
    boolean thrown = false;
    Client client = Client.create();
    WebResource webResource = client.resource(uri);
    JSONObject card = new JSONObject();

    try {
        card.put("id", "1")
        .put("name", "Name of Card")
        .put("code", "123456")
        .put("codeTypeId", "1")
        .put("cardProviderName", "The Card Provider")
        .put("picturePath", "provider.jpg")
        .put("cardProviderUrl", "http://www.provider.com")
        .put("creationDate", "Sun Jun 10 08:55:14 UTC 2012")
        .put("modificationDate","Sun Jun 10 08:55:14 UTC 2012");
    webResource.path("cards").type("application/json").post(card);
    } catch(Exception e) {
        e.printStackTrace();
        thrown = true;          
    }

    assertEquals("Result", false, thrown);
}
}
没有为此线程注册API环境。

我正在做以下工作:

java.lang.NullPointerException: No API environment is registered for this thread.
    at  com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppId(DatastoreApiHelper.java:86)
at     com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppIdNamespace(DatastoreApiHelper.java:96)
at com.google.appengine.api.datastore.Key.<init>(Key.java:106)
at com.google.appengine.api.datastore.Key.<init>(Key.java:90)
at com.google.appengine.api.datastore.Key.<init>(Key.java:86)
at com.google.appengine.api.datastore.Entity.<init>(Entity.java:125)
at com.google.appengine.api.datastore.Entity.<init>(Entity.java:106)
at org.datanucleus.store.appengine.DatastoreFieldManager.<init>(DatastoreFieldManager.java:189)
at  org.datanucleus.store.appengine.DatastorePersistenceHandler.insertPreProcess(DatastorePersistenceHandler.java:354)
at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObjects(DatastorePersistenceHandler.java:267)
at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:256)
at org.datanucleus.state.JDOStateManagerImpl.internalMakePersistent(JDOStateManagerImpl.java:3185)
at org.datanucleus.state.JDOStateManagerImpl.makePersistent(JDOStateManagerImpl.java:3161)
at org.datanucleus.ObjectManagerImpl.persistObjectInternal(ObjectManagerImpl.java:1298)
at org.datanucleus.ObjectManagerImpl.persistObject(ObjectManagerImpl.java:1175)
at org.datanucleus.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:669)
at org.datanucleus.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:694)
at com.acolsolutions.loyaltycard.dataobjects.CardDAO.create(CardDAO.java:23)
at com.acolsolutions.loyaltycard.resources.CardResource.create(CardResource.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1483)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1414)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1363)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1353)
at com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainer._service(GrizzlyContainer.java:215)
at com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainer.service(GrizzlyContainer.java:185)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:163)
at org.glassfish.grizzly.http.server.HttpHandlerChain.service(HttpHandlerChain.java:207)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:163)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:164)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:265)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:134)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:78)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:816)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:111)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:566)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:546)
at java.lang.Thread.run(Unknown Source)
import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;

import javax.ws.rs.core.UriBuilder;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;

import org.glassfish.grizzly.http.server.HttpServer;

import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.Client;

import org.codehaus.jettison.json.JSONObject;

public class CardResourceTests {
private final LocalServiceTestHelper helper = new LocalServiceTestHelper(
        new LocalDatastoreServiceTestConfig()); 

private HttpServer httpServer;
private URI uri;

@Before
public void setUp() throws Exception {
    helper.setUp();

    uri = UriBuilder.fromUri("http://localhost/").port(9998).build();
    ResourceConfig rc = new PackagesResourceConfig("com.acolsolutions.loyaltycard.resources");
    httpServer = GrizzlyServerFactory.createHttpServer(uri, rc);
}

@After
public void tearDown() throws Exception {
    helper.tearDown();

    httpServer.stop();
}

@Test
public void testCreate() {
    boolean thrown = false;
    Client client = Client.create();
    WebResource webResource = client.resource(uri);
    JSONObject card = new JSONObject();

    try {
        card.put("id", "1")
        .put("name", "Name of Card")
        .put("code", "123456")
        .put("codeTypeId", "1")
        .put("cardProviderName", "The Card Provider")
        .put("picturePath", "provider.jpg")
        .put("cardProviderUrl", "http://www.provider.com")
        .put("creationDate", "Sun Jun 10 08:55:14 UTC 2012")
        .put("modificationDate","Sun Jun 10 08:55:14 UTC 2012");
    webResource.path("cards").type("application/json").post(card);
    } catch(Exception e) {
        e.printStackTrace();
        thrown = true;          
    }

    assertEquals("Result", false, thrown);
}
}
  • 在注释之前通过JUnit@加载helper.setUp()(LocalDataStoreService)

  • 在JUnit@Before注释上创建Grizzly Web服务器的实例

  • 执行testCreateCard测试

  • 停止Grizzly Web服务器

  • 在JUnit@After注释上运行helper.tearDown()方法

我使用EclipseIndigo启动(以运行方式)Junit测试(我在Java构建路径中包括JAR)

Jersey或Grizzly Webcontainer似乎正在打开与本地数据存储方法helper.setUp()和helper.tearDown()不兼容的新线程

我发现了一些问题/答案,但与使用AppEngine搭配Jersey无关

有人能帮忙吗?Jersey、AppEngine和JUnit真的可以安装吗?我使用rest assured和jersey测试框架尝试了几种可能性,但所有尝试都以错误和调试告终,并且在AppEngine邮件列表中发布了一篇文章,但没有任何结果

我最后的希望是我目前的设置:

  • Grizzly 2.1(由泽西提供)

  • 泽西1.12

  • JUnit4.10

Stacktrace如下所示:

java.lang.NullPointerException: No API environment is registered for this thread.
    at  com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppId(DatastoreApiHelper.java:86)
at     com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppIdNamespace(DatastoreApiHelper.java:96)
at com.google.appengine.api.datastore.Key.<init>(Key.java:106)
at com.google.appengine.api.datastore.Key.<init>(Key.java:90)
at com.google.appengine.api.datastore.Key.<init>(Key.java:86)
at com.google.appengine.api.datastore.Entity.<init>(Entity.java:125)
at com.google.appengine.api.datastore.Entity.<init>(Entity.java:106)
at org.datanucleus.store.appengine.DatastoreFieldManager.<init>(DatastoreFieldManager.java:189)
at  org.datanucleus.store.appengine.DatastorePersistenceHandler.insertPreProcess(DatastorePersistenceHandler.java:354)
at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObjects(DatastorePersistenceHandler.java:267)
at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:256)
at org.datanucleus.state.JDOStateManagerImpl.internalMakePersistent(JDOStateManagerImpl.java:3185)
at org.datanucleus.state.JDOStateManagerImpl.makePersistent(JDOStateManagerImpl.java:3161)
at org.datanucleus.ObjectManagerImpl.persistObjectInternal(ObjectManagerImpl.java:1298)
at org.datanucleus.ObjectManagerImpl.persistObject(ObjectManagerImpl.java:1175)
at org.datanucleus.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:669)
at org.datanucleus.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:694)
at com.acolsolutions.loyaltycard.dataobjects.CardDAO.create(CardDAO.java:23)
at com.acolsolutions.loyaltycard.resources.CardResource.create(CardResource.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1483)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1414)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1363)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1353)
at com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainer._service(GrizzlyContainer.java:215)
at com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainer.service(GrizzlyContainer.java:185)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:163)
at org.glassfish.grizzly.http.server.HttpHandlerChain.service(HttpHandlerChain.java:207)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:163)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:164)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:265)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:134)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:78)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:816)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:111)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:566)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:546)
at java.lang.Thread.run(Unknown Source)
import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;

import javax.ws.rs.core.UriBuilder;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;

import org.glassfish.grizzly.http.server.HttpServer;

import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.Client;

import org.codehaus.jettison.json.JSONObject;

public class CardResourceTests {
private final LocalServiceTestHelper helper = new LocalServiceTestHelper(
        new LocalDatastoreServiceTestConfig()); 

private HttpServer httpServer;
private URI uri;

@Before
public void setUp() throws Exception {
    helper.setUp();

    uri = UriBuilder.fromUri("http://localhost/").port(9998).build();
    ResourceConfig rc = new PackagesResourceConfig("com.acolsolutions.loyaltycard.resources");
    httpServer = GrizzlyServerFactory.createHttpServer(uri, rc);
}

@After
public void tearDown() throws Exception {
    helper.tearDown();

    httpServer.stop();
}

@Test
public void testCreate() {
    boolean thrown = false;
    Client client = Client.create();
    WebResource webResource = client.resource(uri);
    JSONObject card = new JSONObject();

    try {
        card.put("id", "1")
        .put("name", "Name of Card")
        .put("code", "123456")
        .put("codeTypeId", "1")
        .put("cardProviderName", "The Card Provider")
        .put("picturePath", "provider.jpg")
        .put("cardProviderUrl", "http://www.provider.com")
        .put("creationDate", "Sun Jun 10 08:55:14 UTC 2012")
        .put("modificationDate","Sun Jun 10 08:55:14 UTC 2012");
    webResource.path("cards").type("application/json").post(card);
    } catch(Exception e) {
        e.printStackTrace();
        thrown = true;          
    }

    assertEquals("Result", false, thrown);
}
}

如果你用的是appengine,为什么要用grizzly?阿彭金是你的容器,不是灰熊。

谢谢你把我带到这条路上,瑞克。是的,使用AppEngine作为容器会很好。但是如何在注释前后通过JUnit启动整个web框架呢?当我运行JUnit时,我希望我的环境开始进行测试,然后再次关闭。Google文档只提到通过命令行启动它。我刚刚读到Jetty也将产生新的流程。如何将web服务器限制为只生成一个进程?您不能为单元测试启动web容器。这就是appengine测试线束的用途。您应该以编程方式测试jersey服务,而不是通过向它们发送请求。换句话说,不要使用jersey客户机类来发送请求,而是直接在服务类上调用方法。如果你启动一个容器,那不是一个单元测试。。。这是一个集成测试,我明白了。我会尽力的,谢谢。但即便如此,似乎仍有许多人使用JUnit进行集成测试。所以我猜他们是在“虐待”JUnit?那么我该如何进行集成测试呢?只需编写一个客户机并在启动后连接到服务器?没有滥用,它是一个可以做任何事情的工具。但在本例中,这是错误的,因为您正在启动appengine模拟数据存储和非appengine容器,而这是行不通的。是的,要使用appengine进行集成测试,最好的方法是从命令行启动开发服务器,然后编写脚本来启动它。