2016-01-19 18 views
5

サービスを使用するrest API for resourceがあります。 このサービスには、パラメータを持つコンストラクタがあります。 このリソースをテストし、このサービスを模擬したいと考えています。 これはQuestion: How to pass parameters to REST resource using Jersey 2.5ジャージテストフレームワークを使用したリソース内モックサービス

は@Injectを使用していて使用できないため役に立ちませんでした。 提案がありますか? 私のコードは次のとおりです:

2番目の質問は、私は、パラメータを渡す行い、このresouceをテストする方法である

@Path("/2/{subversion: [0-3]}/users") 
public class UserResource { 
    Logger log = Logger.getLogger(UserResource.class); 
    private MyService service; 
    public void setService(Service ser) { 
     this.service = ser; 
    } 

@ContextのHttpServletRequest currentRequest。

@GET 
@Produces("application/json") 
public Response getUsers(@Context HttpHeaders httpHeaders, @Context UriInfo 
uriInfo) { 
// my function 
} 
} 

「httpHeaders」と「UriInfo」をどのように渡すことができますか。 私のテストは、次のようになります。コンストラクタやセッターを通じて注入のいずれかに

Response response = target("/2/0/users/").request().get(); 
Users users = response.readEntity(Users.class); 
assertNotNull(users); 

答えて

7

サービスのために、それは良い習慣です。これにより、ユニットテスト中に模擬して渡すことが容易になります。嘲笑については、Mockitoのようなフレームワークを使うべきです。そして、あなたはその後、あなたは自分のリソースクラスUNITテストにすべてのこれらのモックを渡すことができ

MyService service = Mockito.mock(MyService.class); 
when(service.getObject()).thenReturn(new Object()); 

HttpHeaders headers = Mockito.mock(HttpHeaders.class); 
when(headers.getHeaderString("X-Header")).thenReturn("blah"); 

UriInfo uriInfo = Mockito.mock(UriInfo.class); 
when(uriInfo.getRequestUri()).thenReturn(URI.create("http://localhost")); 

のようなものを行うことができます。

インテグレーションテストでは、ヘッダーまたはuriinfoをモックする必要はありません。実際のものは渡されます。しかし、あなたが望むなら、あなたはまだサービスを模擬することができます。ここに例があります

public class MockServiceTest extends JerseyTest { 

    public static interface Service { 
     String getMessage(String name); 
    } 

    @Path("message") 
    public static class MessageResource { 

     private final Service service; 

     public MessageResource(Service service) { 
      this.service = service; 
     } 

     @GET 
     public String get(@QueryParam("name") String name, 
          @Context HttpHeaders headers, 
          @Context UriInfo uriInfo) { 
      String nameQuery = uriInfo.getQueryParameters().getFirst("name"); 
      String header = headers.getHeaderString("X-Header"); 
      assertNotNull(nameQuery); 
      assertNotNull(header); 
      return service.getMessage(name); 
     } 
    } 

    private Service service; 

    @Override 
    public ResourceConfig configure() { 
     service = Mockito.mock(Service.class); 
     return new ResourceConfig().register(new MessageResource(service)); 
    } 

    @Test 
    public void testIt() { 
     Mockito.when(service.getMessage("peeskillet")).thenReturn("Hello peeskillet"); 

     Response response = target("message").queryParam("name", "peeskillet").request() 
       .header("X-Header", "blah") 
       .get(); 
     assertEquals(200, response.getStatus()); 
     assertEquals("Hello peeskillet", response.readEntity(String.class)); 
    } 
} 
+0

ありがとうございます。それに関するもう1つの質問は、私が@context属性を持つリソースプロパティを持っていれば何ができますか? 投稿を –

+0

で更新しましたユニットテストを実行している場合は、上記のようにモックしてください。テストフレームワークで統合テストを実行している場合は、HttpServletRequestを注入するためにサーブレットコンテナで実行するように設定する必要があります。 [参照してください](http://stackoverflow.com/q/28436040/2587435) –

+0

バインディングが私のために働いていないように見えます。 HttpServletRequestのバインダーを作成していくつかのブレークポイントを設定しましたが、何も起こりません。私は統合テストを行っています。 –

関連する問題