💻
Jersey Test FrameworkをSpockで動かす
JAX-RSのユニットテストのライブラリにJersey Test Frameworkがある。ドキュメントはJUnitの説明だけなのでSpockで動かす例を説明する。
Dependencies {
compile group: 'javax.ws.rs', name: 'javax.ws.rs-api', version: '2.0.1'
testCompile group: 'org.glassfish.jersey.test-framework.providers', name: 'jersey-test-framework-provider-grizzly2', version: '2.23.1'
testCompile group: 'org.spockframework', name: 'spock-core', version: '1.0-groovy-2.4'
}
JAX-RSとJersey Test Frameworkのライブラリを追加。実はJersey Testには目的によっていくつかのテストを動かすコンテナが用意されいるが詳しくはドキュメント参考。
サンプルは次
HelloResource.java
package example.jaxrs;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@Path("/")
public class HelloResource {
@GET
public String index() {
return "Hello World";
}
}
次にSpockのテストケース。ポイントはJerseyTestの扱い。JUniteではJerseyTestクラスを継承しているがSpockでは多重継承になるのでできない。そこでJerseyTestのインスタンスを作って実行することになる。
package example.jaxrs
import org.glassfish.jersey.server.ResourceConfig
import org.glassfish.jersey.test.JerseyTest
import spock.lang.Shared
import spock.lang.Specification
import javax.ws.rs.core.Application
import javax.ws.rs.core.Response
class HelloResourceTest extends Specification {
@Shared
def jerseyTest = new JerseyTest() {
@Override
protected Application configure() {
return new ResourceConfig(HelloResource.class)
}
}
def setupSpec() {
jerseyTest.setUp()
}
def cleanupSpec() {
jerseyTest.tearDown()
}
def "test index"() {
when:
def response = jerseyTest.target("/").request().get(String.class)
then:
response == "Hello World"
}
def "test index 2"() {
when:
def response = jerseyTest.target("/").request().get()
then:
response.getStatus() == 200
response.readEntity(String.class) == "Hello World"
}
}
このようになる。
Discussion