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;
[TestNGのサポート](https://jersey.java.net/documentation/latest/test-framework.html#testng )にはクラスコンテナがあります。 –
はい。 Junit4にはBeforeClassアノテーションとAfterClassアノテーションがあります。すべてのテストメソッドの後にコンテナの開始/停止が便利なシナリオがあるかどうか疑問に思っていました。 –