1

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

1 に答える 1

1

一般に、静的クラス/メソッドをモックすることは非常に危険です ( http://googletesting.blogspot.it/2008/12/static-methods-are-death-to-testability.html )。 PowerMock ( https://code.google.com/p/powermock/ ) を使用して、自分の制御下にない静的クラスの動作をオーバーライドします。メソッドチェーン全体をモックする必要があると思います:

BlobstoreServiceFactory.getBlobstoreService().createUploadUrl()

BlobStore によって生成された URL ではなく、カスタム URL を返します。

于 2013-07-01T06:40:03.933 に答える