Jersey のテストを書こうと思ったら、 JerseyTest
を継承するって ユーザーガイドに書いてあった。
JUnit4 使うんだったら、やっぱり @Rule
で書いたほうがスタイリッシュなので、 @Rule
で動かせるか試してみた。
リソースクラス
SampleResource.java
package sample.jersey;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@Path("sample")
public class SampleResource {
@GET
public String method() {
return "sample resource";
}
}
ルールクラス
JerseyTestRule.java
package sample.jersey;
import javax.ws.rs.core.Application;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.rules.ExternalResource;
public class JerseyTestRule extends ExternalResource {
private JerseyTest jerseyTest;
public JerseyTestRule(final Application config) {
this.jerseyTest = new JerseyTest() {
@Override
protected Application configure() {
return config;
}
};
}
@Override
public void before() throws Throwable {
this.jerseyTest.setUp();
}
@Override
public void after() {
try {
this.jerseyTest.tearDown();
} catch (Exception e) {
throw new RuntimeException("failed to tear down JerseyTest.", e);
}
}
public JerseyTest getJerseyTest() {
return this.jerseyTest;
}
}
テスト用の Application クラス
TestResourceConfig.java
package sample.jersey;
import org.glassfish.jersey.server.ResourceConfig;
public class TestResourceConfig extends ResourceConfig {
public TestResourceConfig() {
register(SampleResource.class);
}
}
テストクラス
SampleResourceTest.java
package sample.jersey;
import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.Matchers.*;
import org.junit.Rule;
import org.junit.Test;
public class SampleResourceTest {
@Rule
public JerseyTestRule rule = new JerseyTestRule(new TestResourceConfig());
@Test
public void test() {
String response = rule.getJerseyTest().target("sample").request().get(String.class);
assertThat(response, is("sample resource"));
}
}