Java 在Google应用程序引擎LocalSErviceTestHelper上调用tearDown()的NullPointerException

Java 在Google应用程序引擎LocalSErviceTestHelper上调用tearDown()的NullPointerException,java,unit-testing,google-app-engine,memcached,testng,Java,Unit Testing,Google App Engine,Memcached,Testng,我正在为谷歌应用程序引擎Java应用程序编写测试(集成和单元),该应用程序严重依赖于谷歌应用程序引擎服务,如Memcache和Datastore。为了使用这些服务在本地测试我的应用程序,我在所有测试用例的父类中都有这一行: private final LocalServiceTestHelper helper = new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig(), new LocalMemcacheServiceTe

我正在为谷歌应用程序引擎Java应用程序编写测试(集成和单元),该应用程序严重依赖于谷歌应用程序引擎服务,如Memcache和Datastore。为了使用这些服务在本地测试我的应用程序,我在所有测试用例的父类中都有这一行:

private final LocalServiceTestHelper helper = new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig(), new LocalMemcacheServiceTestConfig());
我用这个函数调用开始每个测试(通过TestNG的
@BeforeMethod
注释):

我用这个函数调用结束每个测试(通过TestNG的
@AfterMethod
注释):

(如果你需要的话,这里有一个对和的引用。特别是对于后一个链接,请注意我的代码严格遵循谷歌给出的示例)

需要注意的是,我在Java应用程序中的一个servlet使用MemcacheService实例。它由Guice注入servlet的构造函数

现在,我构建代码并通过调用
mvn clean install
运行它,这将启动Jetty的一个实例,并在编译代码后运行测试让我非常懊恼的是,我在TestNG报告批量测试失败之前打印了这个堆栈跟踪:

SEVERE: Received exception tearing down config of type com.google.appengine.tools.development.testing.LocalMemcacheServiceTestConfig
java.lang.NullPointerException
at com.google.appengine.tools.development.testing.LocalServiceTestHelper.getLocalService(LocalServiceTestHelper.java:495)
at com.google.appengine.tools.development.testing.LocalMemcacheServiceTestConfig.getLocalMemcacheService(LocalMemcacheServiceTestConfig.java:71)
at com.google.appengine.tools.development.testing.LocalMemcacheServiceTestConfig.tearDown(LocalMemcacheServiceTestConfig.java:47)
at com.google.appengine.tools.development.testing.LocalServiceTestHelper.tearDown(LocalServiceTestHelper.java:438)
at com.ea.pogosocial.AbstractTest.tearDown(AbstractTest.java:65)
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:616)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:796)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:907)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1237)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:679)
我几乎用尽了我能想到的一切办法来解决这个问题,但我还是遇到了这个撕裂的问题,这真的让我很难受。除了put()和get(),我不会对servlet中的memcache实例做任何花哨的事情。有人知道我该怎么做吗


如果需要更多的信息或代码,我将很乐意提供。需要注意的一点是:当我用
mvn gae:run
启动Jetty服务器并通过Eclipse执行TestNG测试时,我没有遇到这个问题。这可能是因为我的servlet被注入了memcache的非本地单元测试助手实例,而不是memcache服务的实际版本。

我认为您对如何使用@BeforeMethod和@AfterMethod注释有一点疑问。基本上,这些注释是在每个测试方法执行之前和之后调用的。您不能像上面提到的那样为单个测试方法分配@BeforeMethod和@AfterMethod注释

并尝试在@BeforeClass或@BeforeSuite注释中实现服务器启动。因此,您可以确保在执行测试时服务器已启动

只需将这3个lib(test one的appart)添加到类路径中:

${SDK_ROOT}/lib/impl/appengine-api.jar
${SDK_ROOT}/lib/impl/appengine-api-labs.jar
${SDK_ROOT}/lib/impl/appengine-api-stubs.jar

这应该可以解决问题。

我也有同样的错误。对我来说,问题在于谷歌应用程序引擎SDK依赖项的版本号不匹配

我有:

  • appengine-api-1.0-sdk:1.8.1.1
  • appengine api实验室:1.8.1.1
  • appengine api存根:1.8.1.1
  • 外观测试:1.8.1.1
  • appengine工具sdk:1.7.2

一旦我将appengine tools sdk更新为与其他依赖项相同的版本,我的测试又开始通过。

让我澄清一下。我没有在单独的测试中使用
@beforethod
@AfterMethod
。我确实使用了它们(在测试的父类中)来安装和拆除谷歌服务的本地版本。我的开发团队希望在每次测试之前有一个新的资源列表。
SEVERE: Received exception tearing down config of type com.google.appengine.tools.development.testing.LocalMemcacheServiceTestConfig
java.lang.NullPointerException
at com.google.appengine.tools.development.testing.LocalServiceTestHelper.getLocalService(LocalServiceTestHelper.java:495)
at com.google.appengine.tools.development.testing.LocalMemcacheServiceTestConfig.getLocalMemcacheService(LocalMemcacheServiceTestConfig.java:71)
at com.google.appengine.tools.development.testing.LocalMemcacheServiceTestConfig.tearDown(LocalMemcacheServiceTestConfig.java:47)
at com.google.appengine.tools.development.testing.LocalServiceTestHelper.tearDown(LocalServiceTestHelper.java:438)
at com.ea.pogosocial.AbstractTest.tearDown(AbstractTest.java:65)
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:616)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:796)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:907)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1237)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:679)
${SDK_ROOT}/lib/impl/appengine-api.jar
${SDK_ROOT}/lib/impl/appengine-api-labs.jar
${SDK_ROOT}/lib/impl/appengine-api-stubs.jar