首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模拟Google App Engine服务的答案(例如blobstore)

如何模拟Google App Engine服务的答案(例如blobstore)
EN

Stack Overflow用户
提问于 2013-06-30 20:45:32
回答 1查看 650关注 0票数 1

我正在尝试为我的Google App Engine项目创建一个单元测试。用例如下:客户端向API查询上传URL,因为数据需要存储在blobstore中,客户端收到一个带有URL的JSON编码结构。然后,客户端将数据上载到该URL。

servlet的实现相当简单:

代码语言:javascript
复制
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    Gson gson = new Gson();
    Map<String, String> result = new HashMap<String, String>();
    result.put("uploadurl", BlobstoreServiceFactory.getBlobstoreService()
            .createUploadUrl("/api/v1/import"));
    gson.toJson(result, resp.getWriter());
}

在良好的方式下,应该有一个测试来查看客户端是否确实接收到了正确的数据。所以应该有一个计数器JUnit测试。我希望模拟blob store服务,这样它将返回一个固定的上传url,然后测试可以检查该url。

然而,我不知道如何否决blobstore服务。使用Mockito我不能模拟静态getBlobstoreService(),使用LocalBlobstoreServiceTestConfig我不知道如何否决createUploadUrl()的答案。

我尝试写一个测试是这样的:

代码语言:javascript
复制
public class ImportServletTest {
   public static class Response {
    String uploadurl;

    void setUploadurl(String url) {
        this.uploadurl = url;
    }
}

private LocalBlobstoreServiceTestConfig blobstoreConfig = new LocalBlobstoreServiceTestConfig();

private LocalServiceTestHelper helper = new LocalServiceTestHelper(blobstoreConfig);
@Test
public void getsUploadURL() throws IOException, ServletException {
    ImportServlet servlet = new ImportServlet();

    HttpServletResponse response = mock(HttpServletResponse.class);
    try (CharArrayWriter output = new CharArrayWriter();
            PrintWriter writer = new PrintWriter(output);) {
        when(response.getWriter()).thenReturn(writer);

        servlet.doGet(null, response);
        writer.flush();

        Response apiResponse = new Gson().fromJson(output.toString(), Response.class);
        assertEquals("http://mysite/_ah/theurl", apiResponse.uploadurl);
    }
}

@Before
public void setupGae() throws IOException {
    helper.setUp();
}

@After
public void teardownGae() {
    helper.tearDown();
}
}
EN

回答 1

Stack Overflow用户

发布于 2013-07-01 14:40:04

模拟静态类/方法通常是非常危险的(http://googletesting.blogspot.it/2008/12/static-methods-are-death-to-testability.html),但在一个类似的案例中,我使用PowerMock (https://code.google.com/p/powermock/)覆盖了不在我控制范围内的静态类的行为,取得了一些成功。我猜你将不得不模拟整个方法链:

代码语言:javascript
复制
BlobstoreServiceFactory.getBlobstoreService().createUploadUrl()

返回自定义URL而不是由BlobStore生成的URL。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17390493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档