0

私は、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);
    }

}
4

2 に答える 2

0

すでにSpring Bootオプションにフォールバックしていますが、 Spring Bootなしで統合テストを機能させる方法を共有させてください。

最もトリッキーな部分は、web.xmlのコンテンツを登録することです。そのためには、次のようにサーバーをセットアップする必要があります。

  1. @Before を if 条件で使用して、コンテナーがテスト クラス全体に対して 1 回セットアップされるようにします。これにより、Spring はテストごとに Bean を自動配線する必要がなくなります。
  2. プログラムで WebappContext を作成し、web.xml内にあるすべてを登録してから、そのdeploy メソッドを使用してサーバー インスタンス (つまり、Grizzly など) を渡します。

それはどのように行われますか?

@Before
public void setUp() throws Exception {
    if (server == null) {
        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);
        }
    }

私のweb.xmlで ContextListener をオーバーライドしたため、次の行

ctx.addListener("..."); 

同様の方法で、あなたのweb.xmlに他ならないWebappContextをプログラムで作成することができます。それは魅力のように機能します。

同様の質問に回答しました。詳細を知りたい場合は、回答へのリンクを次に示します。

于 2016-10-01T17:13:21.833 に答える
0

私の解決例があなたの問題を解決できるかもしれません。GitHub でホストしました。

JerseyTest と Spring を統合するためのより良い方法

  • junit テスト クラスに JerseyTest からの継承がない
  • junit テスト クラスの Jersey への依存関係はなく、純粋な jax-rs 依存関係のみ
  • SpringJUnit4ClassRunner と @ContextConfiguration を完全に統合
于 2016-08-03T01:35:53.027 に答える