簡體   English   中英

NullPointerException在Google App Engine LocalSErviceTestHelper上調用tearDown()

[英]NullPointerException calling tearDown() on Google App Engine LocalSErviceTestHelper

我正在為Google App Engine Java應用程序編寫測試(集成和單元),該應用程序嚴重依賴於Memcache和Datastore等Google App Engine服務。 為了使用這些服務在本地測試我的應用程序,我在所有測試用例的父類中都有這一行:

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

我使用此函數調用開始每個測試(通過TestNG的@BeforeMethod注釋):

helper.setUp();

我用這個函數調用結束每個測試(通過TestNG的@AfterMethod注釋):

helper.tearDown();

(這里是對Google App Engine的Java Runtime的 TestNG注釋本地單元測試的參考,如果您需要它。特別是對於后一個鏈接,請注意我的代碼嚴格遵循Google提供的示例)

需要注意的一點是,我在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)

我已經嘗試了幾乎所有我能想到的解決問題的方法,但我仍然遇到這個tearDown()問題,這真的讓我很難過。 除了put()和get()之外,我對servlet中的memcache實例沒有任何想象力。 有沒有人對我該做什么有任何想法?

如果需要更多信息或代碼,我很樂意提供。 有一點需要注意:當我用mvn gae:run啟動我的Jetty服務器時mvn gae:run並通過Eclipse執行TestNG測試,我不會遇到這個問題。 也許這是因為我的servlet正在注入一個memcache的非本地單元測試助手實例,而是一個memcache服務的實際版本。

我有同樣的錯誤。 對我來說,問題是Google App Engine SDK依賴項的版本號不匹配

我有:

  • appengine-api-1.0-sdk:1.8.1.1
  • appengine-api-labs:1.8.1.1
  • appengine-api-stubs:1.8.1.1
  • appengine-testing:1.8.1.1
  • appengine-tools-sdk: 1.7.2

一旦我將appengine-tools-sdk更新為與其他依賴項相同的版本,我的測試再次開始傳遞。

我認為您如何使用@BeforeMethod和@AfterMethod注釋會有輕微問題。 基本上這些注釋在每個測試方法執行之前和每個測試方法執行之后調用。 如上所述,您無法為各個測試方法分配@BeforeMethod和@AfterMethod注釋。

並嘗試嘗試在@BeforeClass或@BeforeSuite注釋中實現您的服務器啟動。 因此,您可以確保在執行測試時服務器已啟動。

只需將這3個庫(測試版的appart)添加到類路徑中:

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

這應該可以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM