2016-07-14 9 views
1

Jersey Testフレームワークを使用してREST APIの機能テストを作成しようとしています。しかし、機能テストで依存性注入を使用することになると、私はロードブロッキングを被るようです。私はhk2-metadata-generatorファイルを読むためにHK2のServiceLocatorUtilities.createAndPopulateServiceLocator()メソッドを使用していますここJersey Test、GrizzlyおよびHK2依存テストの機能テスト

@ApplicationPath("/") 
public class Application extends ResourceConfig { 

    private static final URI BASE_URI = URI.create("http://localhost:8080/api/"); 

    public static void main(String[] args) throws Exception { 
     System.out.println("Starting application..."); 

     final ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator(); 

     final ResourceConfig resourceConfig = new ResourceConfig(); 
     resourceConfig.register(JacksonFeature.class); 
     resourceConfig.register(LoggingFeature.class); 
     resourceConfig.packages(true, "my.package.name"); 

     final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(BASE_URI, resourceConfig, locator); 

     Runtime.getRuntime().addShutdownHook(new Thread(server::shutdownNow)); 

     server.start(); 

     Thread.currentThread().join(); 
    } 
} 

お知らせ:私の主な用途は、次のようになります。このメソッドはServiceLocatorオブジェクトを作成し、次にそれをGrizzlyHttpServerFactory.createHttpServerメソッドに渡します。これはすべてGrizzlyサーバーの稼働に最適ですが、私が今問題としているのは、Jersey Test Frameworkを使用してアプリケーションの機能テストを作成する方法です。

は私のユニットテストは、現在、次のようになります。

public class FormsResourceTest extends JerseyTest { 

    @Override 
    protected TestContainerFactory getTestContainerFactory() throws TestContainerException { 
     return new GrizzlyWebTestContainerFactory(); 
    } 

    @Test 
    public void testMe() { 
     Response response = target("/test").request().get(); 
     assertEquals("Should return status 200", 200, response.getStatus()); 
    } 

} 

ジャージーテストフレームワークとHK2サービスロケータを使用するためにも方法はありますか私は、外部の容器として私のアプリケーションを処理して使用する必要がありますここに記載されている外部コンテナプロバイダ:External container

また、これらは機能テストなので、注入されたサービスを模擬することはオプションではありません。

+0

なぜAbstractBinderを使用して依存関係をバインドしてバインドをResourceConfigに登録し、ResourceConfigをサーバーに渡すことができないのですか? – Raf

+0

@Rafそれは実際に私が行くのをやめた方向です。私はそれを見つけるためにパッケージをスキャンするのではなく、明示的に依存関係を宣言する方が良いということを理解しました。 –

答えて

0

Locator Bridgeを使用して、2つの別々のロケータ(作成したものと1つのもの)を取り出し、それらを一緒にブリッジすることができます。ブリッジは双方向(制限内)にすることもできます。したがって、ほとんどの通常の使用法では1つの大きなServiceLocatorとして扱われます。

今週はServiceLocatorブリッジでまだ修正されていないバグがありましたが、これはまだ次の週にプッシュされます(おそらく)。 HK2-295

関連する問題