2017-11-19 17 views
0

私はspring-cloud-streamをRabbitMQのラッパーとして使用します。SpringストリームでMANUAL ACKをテストする方法 - RabbitMQ

私のプロジェクトでは、MANUAL ACKを使用する必要があります。だから私は適切な設定/コードを追加して、アプリケーションを起動するとになる。メッセージは渡され、ACKは消費者から送り返されます。

@StreamListener(target = Sink.INPUT) 
    public void foo(@Payload String message, 
        @Header(AmqpHeaders.CHANNEL) Channel channel, 
        @Header(AmqpHeaders.DELIVERY_TAG) Long deliveryTag) throws IOException { 
    service.bar(message); 
    channel.basicAck(deliveryTag, false); 
    } 

質問は次のとおりです。

私はAUTO ACKのためのテストを書くことができていますが、マニュアルACKのためにそれを書くためにどのように?私はちょうど渡す方法がわからない@Header(AmqpHeaders.CHANNEL) Channel channel私のテストでは?

答えて

0

[OK]を私は、私はmockitoでそれを行う方法を見つけ出すあると思う:

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) 
public class FooTest { 

    @Autowired 
    private Sink sink; 

    @MockBean 
    private BarService barService; 

    @Test 
    public void hello() throws Exception { 
    //given 
    Channel channel = mock(Channel.class); 
    HashMap<String, Object> attributes = new HashMap<>(); 
    attributes.put(AmqpHeaders.CHANNEL, channel); 
    attributes.put(AmqpHeaders.DELIVERY_TAG, 1); 

    //when 
    sink.input().send(MessageBuilder.createMessage("test-message", new MessageHeaders(attributes))); 

    //then 
    verify(barService).bar("test-message"); 
    verify(channel).basicAck(1, false); 
    } 

} 

しかし、おそらく誰かがヘッダーにChannelをあざけることなく、可能なアプローチがある場合は知っていますか?

0

あなたのリスナーメソッドのユニットテストのために、あなたはちょうどあなたが依存している場合、あなたはたとえば、やりたいかもしれない、あまりにもインフラをテストメッセージを送信モック

foo("test-message", channel, 1L); 

で直接呼び出すことができますフレームワークのメッセージ変換(つまり、JSONを送信し、POJO @Payloadパラメータを持っている。

+0

ユニットテストは私のケースではありません。私のキューの設定が正しいかどうかをチェックする統合テストをしたいと思います。代わりにチャネルを介して直接メッセージを送信してください。 –

+0

その場合、それは明確ではありませんあなたの補足的な質問であなたの答えを尋ねています。 "しかし、ヘッダーにチャンネルを嘲笑せずに可能なアプローチがあるかどうか誰かが知っているのでしょうか?"あなたがしていることは正しいです。 –

+0

RabbitMqが実際のチャンネルを送信できるようにするには、チャンネルを嘲笑せずにそれができるかどうか不思議でした。 –

関連する問題