我試圖創建我的谷歌應用程序引擎項目的單元測試。用例是如下:在客戶端查詢API用於上載的URL,如需要被存儲在Blob存儲區的數據,客戶端臨危一個JSON編碼的結構與所述URL。客戶端然後將數據上傳到該URL。如何嘲笑的谷歌App Engine服務的答案(例如Blob存儲區)
該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,然後測試可以檢查。
但是,我不知道如何來否決Blob存儲服務。使用我的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();
}
}
您不能將該blob存儲服務作爲參數傳遞給您的servlet的構造函數嗎? – fge
的Servlet將通過Servlet框架被實例化,需要一個無參數的構造函數。當然,我可以提供多個構造函數,傳遞真實的GAE服務到不同的構造函數,但是這使得代碼更困難比它需要。另外,我不確定是否允許訪問servlet構造函數中的服務。 –