2016-07-22 5 views
4

私は、いずれかのプロジェクトで統合テストを修正しようとしています。現在、すべての統合テストクラスはJerseyTestクラスを拡張しています。 JerseyTest classを見て、JunitのBeforeとAfterアノテーションアノテーションを使用して、すべてのテストメソッドのコンテナを開始して停止させることに気付きました。テストクラスのすべてのテストでJerseyテストコンテナ(Grizzly)を一度起動するにはどうすればよいですか?

なぜこれが必要ですか?コンテナを一度持ち上げて、テストを実行し、最後にそれをシャットダウンすれば十分ではありませんか?

また、Springを使用しており、コンテキストが初期化されるまでに時間がかかります。

Junit4より前は、ブール値フラグを使用して手動で処理することでこの制限を回避しました。

@Before 
public void setup() { 
    if(!containerStarted) { 
    // start 
    containerStarted = true;  
    } 
// else do nothing 
} 
+0

[TestNGのサポート](https://jersey.java.net/documentation/latest/test-framework.html#testng )にはクラスコンテナがあります。 –

+0

はい。 Junit4にはBeforeClassアノテーションとAfterClassアノテーションがあります。すべてのテストメソッドの後にコンテナの開始/停止が便利なシナリオがあるかどうか疑問に思っていました。 –

答えて

2

@BeforeClassと@AfterClassを使用すると、JerseyTestの@Beforeライフサイクルと@Afterライフサイクルをオーバーライドできます。コードテンプレートは次のとおりです。

public abstract class MyJerseyTest { 
    private JerseyTest jerseyTest; 
    public MyJerseyTest(){ 

    } 

    @BeforeClass 
    public void setUp() throws Exception { 
    initJerseyTest() 
    jerseyTest.setUp(); 
    } 

    @AfterClass 
    public void tearDown() throws Exception { 
    jerseyTest.tearDown(); 
    } 

    private void initJerseyTest() { 
    jerseyTest = new JerseyTest() { 
     @Override 
     protected Application configure() { 
     // do somthing like 
     enable(...); 
     set(...); 

     // create ResourceConfig instance 
     ResourceConfig rc = new ResourceConfig(); 

     // do somthing like 
     rc.property(...); 
     rc.register(...); 

     return rc; 
     } 
    }; 
    } 
} 

希望します。

2

jersey plus springを依存性注入フレームワーク(ジャージースプリングブリッジ)として使用して、同様の状況が発生しました。 JerseyTestフレームワークによる統合テストの作成は、テストの前にコンテナを開始し、テスト後にコンテナを停止するため、難しいです。 このアプローチには利点があるかもしれませんが、春は毎回豆のスキャンとオートワイヤリングを行うという事実を考慮に入れて、非常に時間がかかり、扱いにくいです。

グリズリー容器を一度初期化して、それを テストクラスのすべてのテストに使用するにはどうすればよいですか?

上述の目的を達成するために、私は、次の手順に続く:従っ

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:applicationContext.xml" }) 
public class OrderResourceTest { 
    ... 
    public static final String BASE_URI = "http://localhost:8989/"; 
    private static HttpServer server = null; 
    ... 
    ... 
} 

私はJerseyTestを使用しないことに注意してくださいとしてHttpServerのインスタンスを宣言し、インスタンス変数としてテストクラスでは

をテスト容器のスタート/ストップを自分で処理したいからです。ここで、サーバーインスタンスを設定するには、@Before@AfterClassを使用する必要があります。 @Beforeで 我々はセットアップそれはあなたが約気付いた場合、私は@Beforeを使用しています

@Before 
public void setUp() throws Exception { 
    if (server == null) { 
     System.out.println("Initializing an instance of Grizzly Container"); 
     final ResourceConfig rc = new ResourceConfig(A.class, B.class); 

     WebappContext ctx = new WebappContext() {}; 
     ctx.addContextInitParameter("contextConfigLocation", "classpath:applicationContext.xml"); 

     ctx.addListener("com.package.something.AServletContextListener"); 

     server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc); 
      ctx.deploy(server); 
     } 
    } 

(のようなプログラムでserverインスタンスにweb.xmlファイルをロードする)web.xmlで私たちのカスタムフィルタ/リスナーの定義をロードするようなserverインスタンスを意志しかし、if条件は@BeforeClassとして機能します。私が@BeforeClassを使わなかった理由を正確に覚えておらず、私の推測はおそらくifブロック内のいくつかの設定によると思われます。とにかく、好奇心があれば試してみてください。

  • テストするリソースでResourceConfigを作成します。これには、リソース/コントローラ、ExceptionMapperがあれば、ロードする必要がある他のクラスが含まれます。
  • WebappContextのインスタンスを作成し、たとえばなどのコンテキスト初期化パラメータweb.xmlをプログラムで追加します。 applicationContextにはスプリングベースの設定が含まれています。
  • あなたのweb.xmlにリスナーを持っている場合は、
  • 上に示したように、あなたが任意のフィルタや他の何かを持っているなら、あなたは、プログラムctxに追加する必要があり、プログラムでそれらを追加する必要があります。グリズリーインスタンスと
  • 初期server URIを提供し、ResourceConfig
  • のインスタンスによってすでにプログラムでは何もなく、子web.xmlではありません、今使用してそれにサーバインスタンスを渡す方法を展開しますWebappContextを作成しました。これによりWebappContextのコンフィグが実行され、serverインスタンスにデプロイされます。
  • これで、web.xmlとインスタンスに適用されたスプリング固有の設定を含むGrizzlyのインスタンスが実行されていることが確認できました。

    @AfterClass 
        public static void tearDown() throws Exception { 
         System.out.println("tearDown called ..."); 
         if (server != null && server.isStarted()) { 
          System.out.println("Shutting down the initialized Grizzly instance"); 
          server.shutdownNow(); 
         } 
        } 
    

    に従ってようになります

    @AfterClass使用してサンプルテストREST-保証の枠組み

    @Test 
    public void testGetAllOrderrs() { 
        List<Orders> orders= (List<Orders>) 
        when(). 
         get("/orders"). 
        then(). 
         statusCode(200). 
        extract(). 
         response().body().as(List.class); 
    
        assertThat(orders.size()).isGreaterThan(0); 
    } 
    

    私はREST-を設定するため、上記ベースパスを指定せずに動作する理由があります次のような基本パスを保証します

    RestAssured.baseURI = "http://localhost:8989/"; 
    

    REST-保証次に使用する

    @Test 
    public void testGetAllOrders() { 
        Client client = ClientBuilder.newBuilder().newClient(); 
        WebTarget target = client.target(BASE_URI); 
        Response response = target 
          .path("/orders") 
          .request(MediaType.APPLICATION_JSON) 
          .get(); 
    
        assertThat(response.getStatus()).isEqualTo(200); 
    
        JSONArray result = new JSONArray(response.readEntity(String.class)); 
    
        assertThat(result.length()).isGreaterThan(0); 
    } 
    

    ジャージーベース輸入

    import org.glassfish.grizzly.http.server.HttpServer; 
    import org.glassfish.grizzly.servlet.WebappContext; 
    import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory; 
    import org.glassfish.jersey.server.ResourceConfig; 
    
    関連する問題