私は、Jersey 2 (REST API 用) および Spring (DI 用) で実装された REST プロジェクトに取り組んでおり、機能/統合テストを作成したいと考えています。私は JerseyTest フレームワークを使用し、それらのテストに実際のデータベースを使用しようとしました。私がモック化することを念頭に置いているのは、アプリが消費するリモート Web サービス (SOAP) だけであり、生成された WS クライアントをモック化する必要があります。
Jersey2 と Spring を使用した JerseyTest フレームワークに関する調査に多くの時間を費やした後、統合テスト用にその設定を行うことは不可能のようです。似たようなものをセットアップすることに成功したことを教えてもらえますか?
JerseyTestの問題は、複数のフィルターとサーブレットを登録するなど、web.xml構成ファイルのすべての設定を使用できないこと、およびモックオブジェクトを定義するためのテストで実行されるアプリ用に構成した同じSpringコンテキストを使用できないことです。テストごとに返されるもの。私の各RESTリソースはSpring Securityの保護下にあり、リスナーを登録する必要があるため、JerseyTestフレームワークもロードされていません。
それを達成する方法、または上記のすべてを達成するために別のテストフレームワークを使用する方法についてアドバイスをお願いします...
そのjunitテストからの私のコードは次のとおりです。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {MyResourceTest.MOCK_SPRING_APPLICATION_CONTEXT})
public class MyResourceTest extends JerseyTest {
public static final String MOCK_SPRING_APPLICATION_CONTEXT = "classpath:spring/testApplicationContext.xml";
@Override
protected Application configure() {
ResourceConfig resourceConfig = new MyResourceConfig();
disable(TestProperties.LOG_TRAFFIC);
disable(TestProperties.DUMP_ENTITY);
resourceConfig.property("contextConfigLocation", MOCK_SPRING_APPLICATION_CONTEXT);
return resourceConfig;
}
@Override
protected TestContainerFactory getTestContainerFactory() {
return new GrizzlyWebTestContainerFactory();
}
@Override
protected DeploymentContext configureDeployment() {
return ServletDeploymentContext
.forServlet(new ServletContainer(new MyResourceConfig()))
.addListener(MyContextLoaderListener.class) // Extends Spring's listener
.addListener(RequestContextListener.class)
.contextParam("contextConfigLocation", MOCK_SPRING_APPLICATION_CONTEXT)
.build();
}
@Test
@SqlGroup({
@Sql(scripts = {"classpath:db_scripts/clean-up.sql", "classpath:db_scripts/init-db.sql"}),
@Sql(scripts = "classpath:db_scripts/clean-up.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
})
public void shouldReceiveResourceTest() throws IOException {
// Prepare request ...
final MyResponse myResponse = target("/resource/1").request().post(myRequest, MyResponse.class);
assertNotNull(myResponse);
}
}