gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:33:11 25 4
gpt4 key购买 nike

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

servlet 的实现相当简单:

@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 存储服务,以便它返回一个固定的上传 URL,然后测试可以检查该 URL。

但是,我不知道如何否决 blobstore 服务。使用 Mockito 我无法模拟静态 getBlobstoreService(),使用 LocalBlobstoreServiceTestConfig 我不知道如何覆盖 createUploadUrl() 的答案。

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

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();
}
}

最佳答案

模拟静态类/方法通常非常危险( http://googletesting.blogspot.it/2008/12/static-methods-are-death-to-testability.html ),但在类似的情况下,我使用 PowerMock ( https://code.google.com/p/powermock/ )来覆盖不受我控制的静态类的行为,取得了一些成功。我想你必须模拟整个方法链:

BlobstoreServiceFactory.getBlobstoreService().createUploadUrl()

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

关于java - 如何模拟 Google App Engine 服务的答案(例如 blobstore),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17390493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com