2

我正在针对在本地 Jetty 实例上运行的 Google App Engine 项目编写集成测试。

在运行测试之前,我在http://localhost:8083. 启动时,Web 服务会创建一个 memcached 实例,它将向其中写入数据。我们使用的是 Google Guice,所以这是通过如下所示的绑定完成的:

bind(AsyncMemcacheService.class).toInstance(MemcacheServiceFactory.getAsyncMemcacheService());
bind(MemcacheService.class).toInstance(MemcacheServiceFactory.getMemcacheService());

Web 服务启动并运行后,我将开始集成测试。至关重要的是,它们是在一个单独的 Jetty 实例上启动的,该实例创建了自己的 memcached 绑定。

我编写了一个如下所示的集成测试:

@Test(groups = "integration")
private void doSomeTest() {
    //set up some precondition for the test
    String id = "myIntegerObject";
    this.memcached.putSomeObject(id, 0);

    try {
        //call an endpoint that relies on the previously set value
        String url = "http://localhost:8083/api/increment/" + id;
        this.http.post(url);
    } catch (Exception e) {
        e.printStackTrace();
        Assert.fail("Test failed. See inner exception for details.", e);
    }

    //verify that hitting the url had the desired effect
    Assert.assertEquals(this.memcached.getSomeObject(id), 1);
}

这个测试总是Assert.assertEquals(...);在线失败,因为我的 web 服务和我的集成测试正在写入不同的 memcached 实例。

有没有办法设置我的 Web 服务、单元测试和集成测试都共享的系统范围的 memcached 实例?

4

1 回答 1

3

远程 API在这里对你有用吗?虽然它旨在允许您连接到生产appspot.com应用程序,但您也可以使用它连接到本地 dev_appserver:

new RemoteApiOptions().server("localhost", 8083).credentials("test@example.com", "");

您进行的任何 API 调用都将使用远程 API 来访问其他实例。请注意,远程 API 不限于文档建议的数据存储 API。Memcache 以同样的方式工作。

我创建了一个示例 Eclipse 项目,它既是一个“hello world”App Engine 应用程序,您可以在本地部署或运行​​它,又是一个TestClient.java使用远程 API 执行远程 memcacheget()put()调用的 trivial 应用程序:

$ java client.TestClient localhost 8083 test@example.com pass foo bar

new RemoteApiOptions()
.server("localhost", 8083)
.credentials("test@example.com", "pass")
mc.get("foo") -> null
mc.put("foo", "bar")
mc.get("foo") -> bar
于 2013-02-06T23:35:30.913 回答