Google App Engine プロジェクトの単体テストを作成しようとしています。ユース ケースは次のとおりです。クライアントは API にアップロード URL をクエリします。データをブロブストアに保存する必要があるため、クライアントは URL を含む JSON エンコード構造を受け取ります。その後、クライアントはその URL にデータをアップロードします。
サーブレットの実装はかなり単純です。
@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 テストが必要です。テストで確認できる固定のアップロード URL を返すように、ブロブ ストア サービスをモックしたいと考えていました。
ただし、ブロブストア サービスを無効にする方法がわかりません。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();
}
}