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