テスト用のインスタンスをすばやく作成するために使用できるjavax.ws.rs.core.UriInfo
の実装はありますか。このインターフェースは長いので、何かをテストする必要があります。このインターフェースの実装全体に時間を無駄にしたくありません。
PDATE:次のような関数の単体テストを作成したいと思います。
@GET
@Path("/my_path")
@Produces(MediaType.TEXT_XML)
public String webserviceRequest(@Context UriInfo uriInfo);
フィールドまたはメソッドのパラメーターとして、@Context
アノテーションを付けて挿入するだけです。
@Path("resource")
public class Resource {
@Context
UriInfo uriInfo;
public Response doSomthing(@Context UriInfo uriInfo) {
}
}
リソースクラス以外に、ContainerRequestContext
、ContextResolver
、MessageBodyReader
などの他のプロバイダーに挿入することもできます。
実際、doSomthing()関数に似た関数のjunitテストを作成したいと思います。
私はあなたの投稿でそれを取り上げませんでした。しかし、ユニットテストのために私が考えることができるいくつかのオプション
使用するメソッドのみを実装して、スタブを作成するだけです。
Mockito のようなモックフレームワークを使用し、UriInfo
をモックします。例
@Path("test")
public class TestResource {
public String doSomthing(@Context UriInfo uriInfo){
return uriInfo.getAbsolutePath().toString();
}
}
[...]
@Test
public void doTest() {
UriInfo uriInfo = Mockito.mock(UriInfo.class);
Mockito.when(uriInfo.getAbsolutePath())
.thenReturn(URI.create("http://localhost:8080/test"));
TestResource resource = new TestResource();
String response = resource.doSomthing(uriInfo);
Assert.assertEquals("http://localhost:8080/test", response);
}
この依存関係を追加する必要があります
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.0</version>
</dependency>
実際のUriInfoが挿入される統合テストを実行する場合は、 Jersey Test Framework を調べる必要があります。
これがJerseyTestFrameworkの完全な例です
public class ResourceTest extends JerseyTest {
@Path("test")
public static class TestResource {
@GET
public Response doSomthing(@Context UriInfo uriInfo) {
return Response.ok(uriInfo.getAbsolutePath().toString()).build();
}
}
@Override
public Application configure() {
return new ResourceConfig(TestResource.class);
}
@Test
public void test() {
String response = target("test").request().get(String.class);
Assert.assertTrue(response.contains("test"));
}
}
この依存関係を追加するだけです
<dependency>
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
<artifactId>jersey-test-framework-provider-inmemory</artifactId>
<version>${jersey2.version}</version>
</dependency>
小規模なテストに最も効率的なインメモリコンテナを使用します。必要に応じて、サーブレットをサポートする他のコンテナがあります。上に投稿したリンクをご覧ください。
モックするか、 http://arquillian.org/
統合テストを書いていたので、モックは使えません
ジャージテストにいくつかのコードを使用しました
WebApplicationImpl wai = new WebApplicationImpl();
ContainerRequest r = new TestHttpRequestContext(wai,
"GET", null,
"/mycontextpath/rest/data", "/mycontextpath/");
UriInfo uriInfo = new WebApplicationContext(wai, r, null);
myresources.setUriInfo(uriInfo);
そして
private static class TestHttpRequestContext extends ContainerRequest {
public TestHttpRequestContext(
WebApplication wa,
String method,
InputStream entity,
String completeUri,
String baseUri) {
super(wa, method, URI.create(baseUri), URI.create(completeUri), new InBoundHeaders(), entity);
}
}
リクエストスコープBeanに関するエラーが発生した場合は、 SpringテストでのリクエストスコープBean を参照してください。