使用GWT和GAE进行JUnit测试

我想要一些JUnit测试(用GWT创建)来联系一个servlet(里面有GAE调用)。 当我运行测试时,我得到以下堆栈跟踪:

java.lang.NullPointerException at com.google.appengine.api.NamespaceManager.get(NamespaceManager.java:101) at com.google.appengine.api.memcache.BaseMemcacheServiceImpl.getEffectiveNamespace(BaseMemcacheServiceImpl.java:65) at com.google.appengine.api.memcache.AsyncMemcacheServiceImpl.doGet(AsyncMemcacheServiceImpl.java:295) at com.google.appengine.api.memcache.AsyncMemcacheServiceImpl.contains(AsyncMemcacheServiceImpl.java:283) at com.google.appengine.api.memcache.MemcacheServiceImpl.contains(MemcacheServiceImpl.java:44) at com.peerkesoftware.etheria.web.server.model.UpdateTimer.(UpdateTimer.java:17) at com.peerkesoftware.etheria.web.server.UpdateTimerServlet.(UpdateTimerServlet.java:12) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at java.lang.Class.newInstance0(Class.java:355) at java.lang.Class.newInstance(Class.java:308) at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153) at org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:463) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:324) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:829) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:513) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488) 

有人可以向我解释为什么会这样吗? 我该如何解决这个问题? 在运行测试之前是否需要初始化某些内容?

我正在使用GWT版本2.5.1和GAE版本1.7.5。

我的代码可以在GitHub上查看。

我自己弄清楚了。

我使用的解决方案:创建LocalServiceTestHelper并在对servlet进行任何调用之前进行设置。 然后我所有的JUnit测试都是绿色的。

抛出空指针exception的第101行对应于https://code.google.com/p/googleappengine/source/browse/trunk/java/src/main/com/google/appengine/api/NamespaceManager.java

 Map attributes =ApiProxy.getCurrentEnvironment().getAttributes(); 

我猜你的ApiProxy.getCurrentEnvironment()返回null。

解决方案 :将war / WEB-INF / web.xml编辑为ApplicationServlet而不是GAEApplicationServlet。

我想指出,GWT客户端的unit testing不应该在服务器端如此深入地运行。 您应该使用模拟或避免从GWT测试调用服务器端类来保持GWT测试更快和客户端特定。