理系学生日記

おまえはいつまで学生気分なのか

Stubby4JをJUnitから利用する

Stubby4J を Junit で起動できればだいたいの HTTP 要求に関するテストはできる。
だいたいこんな感じでテストを書きたい。

public class Stubby4jTest {
    
    @ClassRule
    public static Stubby4jServer server 
        = Stubby4jServer.fromResource("com/kiririmode/blog/http/client/stubby4j.yaml");

    @Test
    public void test() throws Exception {
        ClientResponse<?> response = new ClientRequest("http://localhost:8882/hello-world").get();
        assertThat(response.getEntity(String.class), is("Hello World!"));
    }
}

よくよく考えると Java で書かれていて Jetty 組み込みのサーバなんだし悩むことなかった。 Stubby4J の API 見ると Jetty 起動する API も既に用意されてた。

public class Stubby4jServer extends ExternalResource {

    private String yamlConfigurationFileName;
    private StubbyClient stubbyClient;

    public static Stubby4jServer fromResource(String resource, boolean isMute) {
        String yamlConfigurationFileName = Stubby4jServer.class.getClassLoader().getResource(resource).getPath();
        return new Stubby4jServer(yamlConfigurationFileName, isMute);
    }

    public static Stubby4jServer fromResource(String resource) {
        return fromResource(resource, true);
    }

    private Stubby4jServer(String yamlConfigrationFileName, boolean isMute) {
        this.yamlConfigurationFileName = yamlConfigrationFileName;
        ANSITerminal.muteConsole(isMute);
    }

    @Override
    protected void before() {
        try {
            stubbyClient = new StubbyClient();
            stubbyClient.startJetty(yamlConfigurationFileName);
        } catch (Exception e) {
            throw new RuntimeException(
                    String.format("stubby4J start failed.  conf=[%s]", yamlConfigurationFileName),
                        e);
        }
    }

    @Override
    protected void after() {
        try {
            stubbyClient.stopJetty();
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

}