2011-10-09 12 views
5

私はJUnitでテストしたいジャージリソースを持っています。リソースが特定のフィールドを注入するGuiceのプロバイダを使用しています。Guiceのフィールドを注入したJerseyリソースのユニットのテスト

@Path("/example/") 
class ExampleResource { 
    @Inject 
    Provider<ExampleActionHandler> getMyExampleActionHandlerProvider; 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public List<ExamplePojo> getExampleList() { 
     ExampleActionHandler handler = getMyExampleActionHandlerProvider.get(); 
     handler.doSomething(); 
    ... 

しかし、それは問題があるテスト、APIを提供するために実サーバを使用する場合、すべてが美しく動作します。

私のテストクラスが現在のようなものになります。

明らかに
public class ApiTest extends JerseyTest { 

    public ApiTest() throws Exception { 
    super(); 
    ApplicationDescriptor appDescriptor = new ApplicationDescriptor(); 
    appDescriptor.setContextPath("/api"); 
    appDescriptor.setRootResourcePackageName("com.my.package.name"); 
    super.setupTestEnvironment(appDescriptor); 
    } 

    @Test 
    public void testHelloWorld() throws Exception { 
    String responseMsg = webResource.path("example/").get(String.class); 
    Assert.assertEquals("{}", responseMsg); 
    } 
} 

を、Guiceのはhandler.doSomething()呼び出しはNullPointerExceptionが生じないようにExampleResourceでフィールドを初期化する機会を得ていません。

Jerseyに、Guiceを使用してExampleResourceクラスをインスタンス化してプロバイダが動作するように指示する方法はありますか?

+1

でそれからApplicationDescriptorオブジェクトを取得? – talon8

+0

@minichateあなたはこれを稼働させましたか? –

答えて

0

これを行う1つの方法は、テストを数ステップに分割することです。サービスを構成するインジェクタを作成し、そのインジェクタをテストする必要があります(Testing Guice Servlet bindingsおよびTesting Guice can init servlets参照)。これらのテストを使用すると、適切なバインディングが適切に設定されていることを確認できます。 あなたはインジェクタを持っていたら、私はこれは少し遅れている知っているが、あなたはまだこれを見ているオフのチャンスに、あなたは何をして終わるんでした

ExampleResource exampleResource = injector.getInstance(ExampleResource.class); 
Assert.assertEquals(myList, getExampleList()); 
+0

このアプローチの問題は、@DefaultValue()などの注釈付きフィールドのように、Jerseyが行う魔法のどれも利用できないということです。私は実際には、私がそれを望む方法でこれを手に入れました。ちょうどそれを後にできるものに包み込もうとしています。 – minichate

+0

どうやってこれを稼働させましたか? – bobK

関連する問題