tokuhirom's Blog

Java なウェブアプリのテストをするための mech というライブラリを書いていた

https://github.com/tokuhirom/mech

@Test
public void testGoogle() throws Exception {
    try (Mech mech = new Mech("http://google.com/")) {
        try (MechResponse res = mech.get("/").execute()) {
            assertEquals(200, res.getStatusCode());
        }
    }
}

こんな感じで使える。この使い方は本筋じゃなくて本当にやりたいのはこっち。

class MyServlet extends HttpServlet {
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.getWriter().write("Hello");
    }

}

public class ServletTest {
    @Test
    public void test() throws Exception {
        try (MechJettyServlet mech = new MechJettyServlet(new MyServlet())) {
            try (MechResponse res = mech.get("/").execute()) {
                assertEquals(200, res.getStatusCode());
                assertEquals("Hello", res.getContentString());
            }
        }
    }
}

適当につくったサーブレットを、ささっとテストできる。裏のスレッドで Jetty たてて、それベースでテストしてくれる。 便利~。

なかなか便利に使えるようになったんで、オープン&シェアさせていただきます。

JSON をポストしたい

try (MechResponse res = mech.postJSON("/json", form).execute()) {
    assertEquals(200, res.getStatusCode());
    assertEquals("+++{\n"
            + "  \"name\" : \"hoge\"\n"
            + "}+++", res.getContentString());
}

JSON を受け取ったのを読み込みたい

Form form = res.readJSON(new TypeReference<Form>() {
});

Jackson でいい感じに処理できます。

POST したい

try (MechResponse res = mech.post("/postForm").param("name", "pp太郎")
        .execute()) {
    assertEquals(200, res.getStatusCode());
    assertEquals("pp太郎", res.getContentString());
}

multipart/form-data でテストしたい

try (MechResponse res = mech.postMultipart("/postMultipart")
        .param("name", "pp太郎").file("file", new File("pom.xml"))
        .execute()) {
    assertEquals(200, res.getStatusCode());
    assertEquals("pp太郎XXXpom.xml", res.getContentString());
}

リクエストとレスポンスの具合を表示したい

mech.addRequestListener(new PrintRequestListener(ps));

うまいこと、全部経過を表示できる。これでテストした結果を、ドキュメントに貼ったりしてる。

Installation

<repositories>
    <repository>
        <id>tokuhirom</id>
        <url>https://tokuhirom.github.io/maven/releases/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>me.geso</groupId>
        <artifactId>mech</artifactId>
        <version>0.7.1</version>
    </dependency>
</dependencies>

pom.xml にこういう感じで書いてくだされ。

javadoc

http://tokuhirom.github.io/maven/javadoc/me/geso/mech/0.7.1/apidocs/index.html

このへんにおいてあります。