Google应用引擎数据存储区测试未针对此线程异常注册api环境

时间:2016-11-08 04:49:35

标签: java google-app-engine testing

我已经为谷歌应用引擎编写了验收测试。但每当我执行测试时,我都会遇到以下异常

java.lang.NullPointerException: No API environment is registered for this thread.
at com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppId(DatastoreApiHelper.java:180)
at com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppIdNamespace(DatastoreApiHelper.java:196)
at com.google.appengine.api.datastore.Query.<init>(Query.java:208)
at com.google.appengine.api.datastore.Query.<init>(Query.java:139)
at com.google.appengine.datanucleus.query.DatastoreQuery.compile(DatastoreQuery.java:236)
at com.google.appengine.datanucleus.query.JDOQLQuery.performExecute(JDOQLQuery.java:158)
at org.datanucleus.store.query.Query.executeQuery(Query.java:1789)
at org.datanucleus.store.query.Query.executeWithArray(Query.java:1666)
at org.datanucleus.store.query.Query.execute(Query.java:1639)
at org.datanucleus.api.jdo.JDOQuery.execute(JDOQuery.java:221)
at com.teamsuccesso.campaignmonitor.dao.impl.SimpleQueryDaoImpl.getObjectListUsingQuery(SimpleQueryDaoImpl.java:189)
at com.teamsuccesso.campaignmonitor.service.user.impl.UserServiceImpl.saveUser(UserServiceImpl.java:18)
at com.teamsuccesso.campaignmonitor.controller.user.UserController.createAdmin(UserController.java:62)
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 org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:349)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:300)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:133)
... 43 more

以下是我的代码

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextHierarchy({
        @ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/dispatcher-servlet.xml" }) })
public class AT_AdGroupController {
    @SuppressWarnings("unused")
    private MockHttpSession session = new MockHttpSession();
    private final LocalServiceTestHelper helper = new LocalServiceTestHelper(
            new LocalDatastoreServiceTestConfig().setDefaultHighRepJobPolicyUnappliedJobPercentage(1).setStoreDelayMs(0));

    @Autowired
    private WebApplicationContext webContext;
    private MockMvc mockMVC;

    @SuppressWarnings("unused")
    private static ObjectMapper mapper;

    @BeforeClass
    public static void startUp() {
        mapper = new ObjectMapper();
    }

    @Before
    public void testSetup() {
        MockitoAnnotations.initMocks(this);
        helper.setUp();
        this.mockMVC = MockMvcBuilders.webAppContextSetup(webContext).build();
    }
    @Test
    public void testSaveAd() throws Exception {
        CommonAdBean ad = new CommonAdBean();
        ad.setAdType("FaceBook");
        ad.setAdName("AdName");
        ad.setDateOfReport("Mon Oct 17 2016 17:26:36 GMT+0530 (India Standard Time)");
        ad.setReportingStarts("1991-01-01");
        ad.setTreportingEnds("1991-01-22");
        ad.setStarts("1991-10-11");
        ad.setEnds("01-01-1991");
        String inputJSon = new GsonBuilder().serializeNulls().create().toJson(ad);
        System.out.println("InPut:" + inputJSon);
        MvcResult returnValue = this.mockMVC
                .perform(org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post("/adgroups/1")
                        .contentType(MediaType.APPLICATION_JSON).content(inputJSon.getBytes()))
                .andExpect(org.springframework.test.web.servlet.result.MockMvcResultMatchers.status().isOk())
                .andReturn();
        System.out.println("OutPut:" + returnValue.getResponse().getContentAsString());
        returnValue = this.mockMVC
                .perform(org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post("/adgroups/1")
                        .contentType(MediaType.APPLICATION_JSON).content(inputJSon.getBytes()))
                .andExpect(org.springframework.test.web.servlet.result.MockMvcResultMatchers.status().isOk())
                .andReturn();
        System.out.println("OutPut:" + returnValue.getResponse().getContentAsString());
        AdBean adbean =  new GsonBuilder().serializeNulls().create().fromJson(returnValue.getResponse().getContentAsString(), AdBean.class);
        assertNotNull(adbean.getId());
    }
}

对于依赖我正在使用maven并且我添加了所需的所有依赖项。以下是我添加的依赖项

  • appengine-api-1.0-sdk
  • appengine-testing
  • 应用服务引擎的API存根
  • 应用服务引擎的API-实验室
  • 应用服务引擎的工具-SDK

我的appengine版本是1.9.44,我也使用spring mvc

1 个答案:

答案 0 :(得分:0)

我认为你的问题与这个问题有关:
How do I register API environment for Datastore in GAE Flexible Environment?

您需要使用最新的库来在灵活的环境中访问数据存储区。

您可以在此处找到项目home pagegithub repository