簡単なサーブレットのテスト

たとえばこんな、すごく単純なサーブレット

public void doGet(HttpServletRequest request, HttpServletResponse response) {
    response.setStatus(200);
}

200 OKを返すだけの、本当に単純なサーブレット
流石にここまで単純なのはないけど、あくまで例として。

こんな、単純なものでも試験はせにゃならないわけで
そのためだけに、EasyMockとかわざわざ入れるのもどうかと思った。
じゃあ、自前で実装すればいいじゃない
やりたいことは、setStatus(int)だけなのだから

public MockHttpServletResponse implements HttpServletResponse {

    private int status;

    @Override
    public void setStatus(int i) {
        this.status = i;
    }

    // 試験用(ステータスコードを取得)
    public int getStatus() {
        return status;
    }

    //以下盛大に省略
}

これだけの実装をしたモックさんを用意して

    MockHttpServletRequest mockResponse = new MockHttpServletRequest();
    testServlet.doGet(null, mockResponse);
    int status = mockResponse.getStatus();

こうやってやれば、statusに何セットしたかどうかわかるよねっ!

これだけなら、非常に簡単なお話だったのだけど、
テストしたかったサーブレットはこんなこともやってた。

public void doGet(HttpServletRequest request, HttpServletResponse response) {
    PrintWriter out = response.getWriter();
    out.print("<html></html>");
    // 中略
    response.setStatus(200);
}

PrintWriter#printとかちょっと詰んだ気しかしない。
でも、ちょっと頑張ってみたら、意外と簡単に何とかなった。
というわけで、実装追加したモックさん。

public MockHttpServletResponse implements HttpServletResponse {

    private int status;
    StringWriter stringWriter = new StringWriter();

    @Override
    public void setStatus(int i) {
        this.status = i;
    }

    // 試験用(ステータスコードを取得)
    public int getStatus() {
        return status;
    }

    @Override
    public void getPrintWriter() {
        return new PrintWriter(stringWriter);
    }

    // 試験用(PrintWriterで出力した文字列を取得)
    public String getPrintWritedString() {
        return stringWriter.toString();
    }

    //以下やっぱり盛大に省略
}

これくらいの実装なら、自分で書いちゃったほうが早いよね。多分。
Eclipseなら必要なメソッドはreturn nullとかで適当に実装してくれちゃうし。
今回は初回だったんで時間かかったけど。