2017-11-19 2 views
0

Ich verwende Spring-Cloud-Stream als Wrapper für RabbitMQ.So testen Sie MANUAL ACK im Spring Stream - RabbitMQ

In meinem Projekt muss ich MANUAL ACK verwenden. Also habe ich passende Konfiguration/Code hinzugefügt und es funktioniert wenn ich die Anwendung einschalte. Nachrichten werden übergeben und ACK wird vom Konsumenten zurück gesendet.

@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); 
    } 

Frage ist:

Ich kann den Test für AUTO ACK schreiben, aber, wie es für MANUAL ACK zu schreiben? Ich weiß einfach nicht, wie man@Header(AmqpHeaders.CHANNEL) Channel channelin meinem Test übergibt?

Antwort

0

Ok ich glaube, ich habe herausfinden, wie es mit Mockito zu tun:

@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); 
    } 

} 

Aber vielleicht weiß jemand, ob es möglich ist, ohne den Ansatz Channel in Header zu verspotten?

0

Für eine Einheit Test Ihrer Listener-Methode, können Sie es einfach direkt anrufen mit der Mock

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

Senden einer Nachricht prüft auch die Infrastruktur, die Sie tun wollen könnte, zum Beispiel, wenn Sie sich verlassen auf die Nachrichtenkonvertierung des Frameworks (dh JSON senden und haben einen POJO @Payload Parameter.

+0

Der Komponententest ist nicht mein Fall. Ich möchte Integrationstest haben, die auch überprüfen, ob die Konfiguration meiner Warteschlangen korrekt ist. Also muss ich Senden Sie die Nachricht über den Kanal stattdessen direkt Aufruf der Behandlungsmethode –

+0

In diesem Fall ist es nicht klar, was t fragen Sie in Ihrer Zusatzfrage in Ihrer Antwort "Aber vielleicht weiß jemand, ob es einen möglichen Ansatz gibt, ohne den Kanal in Kopfzeilen zu verspotten?". Was Sie tun, ist richtig. –

+0

war nur neugierig, wenn es tun kann, ohne den Kanal zu verspotten, so wie RabbitMq den echten Kanal senden kann. –

Verwandte Themen