2

http:outbound-gatewaySpring Integration ワークフローで最適な単体テストを行う方法を見つけようとしています。

ゲートウェイは次のようになります。

<int-http:outbound-gateway id="gateway"
                           request-channel="registrationQueue"
                           message-converters="jsonMessageConverter"
                           url-expression="@urlGenerator.resolve()"
                           http-method="POST"
                           expected-response-type="javax.ws.rs.core.Response"
                           reply-channel="nullChannel"
                           error-handler="httpResponseErrorHandler"/>

具体的には、..

  1. 送信されるオブジェクトのシリアル化をアサートします。はmessage-convertersからのメッセージを正しく処理しますrequest-channelか?
  2. サードパーティ サービスからの応答処理を確認します。さまざまな応答 (予期されるものと予期しないもの) とエラー (内部と外部) が与えられた場合の動作は何ですか?

エンドポイントを模擬し、統合ワークフローのステップが期待どおりに動作することをアサートする多くの単体テストがあります。次のようなもの:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:test-config.xml"})
public class FileRegistrationWorkflowTest {

    ...

    @Autowired
    private MessageChannel fileFoundChannel;

    @Autowired
    private QueueChannel testRegistrationQueue;

    ...

    @Test
    public void shouldQueueRegistrationForFileWithEntityId() {
        // Given
        mockFileLookupService(FILE_ID, FILENAME_WITH_ENTITY_ID);
        // When
        fileFoundChannel.send(MessageBuilder.withPayload(FILE_ID).build());
        // Then
        Message<?> message = testRegistrationQueue.receive();
        assertThat(message, hasPayload(expected));
    }

}

このテスト方法は、ワークフローに沿ったステップに最適です。問題は、エンド ポイント ゲートウェイのテストです。

  • をモックできないのでhttp:outbound-gateway、テストしていません。
  • 対話するために実際の HTTP サービスをデプロイしたくはありません。これは統合テストです。
  • サードパーティ サービスは によってのみ解決されるためurl-expression、モック アウトする Spring Bean はありません。

おそらく、Spring が送信しようとする HTTP リクエストを傍受できるでしょうか?

4

1 に答える 1