2013-06-30 25 views
1

我試圖創建我的谷歌應用程序引擎項目的單元測試。用例是如下:在客戶端查詢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(); 
} 
} 
+0

您不能將該blob存儲服務作爲參數傳遞給您的servlet的構造函數嗎? – fge

+1

的Servlet將通過Servlet框架被實例化,需要一個無參數的構造函數。當然,我可以提供多個構造函數,傳遞真實的GAE服務到不同的構造函數,但是這使得代碼更困難比它需要。另外,我不確定是否允許訪問servlet構造函數中的服務。 –

回答

1

懲戒靜態類/方法是一般非常危險(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產生。

+0

謝謝,我會檢查一下。不幸的是,爲了測試這樣一種簡單的方法,我的測試代碼在大小和複雜度上爆炸了。 –