0

Ich versuche, einen Integrationstest für JMS-Dienst zu schreiben, der wie folgt aussieht.JMS-Integrationstests

@JmsListener(destination = "mailbox", containerFactory = "myFactory") 
public void receiveMessage(Email message) throws InterruptedException { 
    try { 
     sendEmail(message); 
    }catch (Exception e){ 
     LOGGER.log(Level.SEVERE,"Failed to deliver email",e); 
     Thread.sleep(TimeUnit.SECONDS.toSeconds(Optional.of(retryInterval).orElse(5))); 
     throw e; 
    } 
} 

private void sendEmail(Email message){ 
    ............... 
} 

Zuallererst, kann ich dieses etwas wie spotten? Ich habe versucht, es zu verspotten, aber wenn ich eine Nachricht sende, ruft die Spring-Boot-Anwendung die tatsächliche JMS-Bean und nicht die falsche. Scheint so, als ob das nicht möglich ist. Auch wenn dies nicht möglich ist, kann ich zumindest die Bean outdoire und irgendwie überprüfen, ob die Methode receiveMessage aufgerufen wird. Außerdem sollte der sendEmail-Teil gefälscht werden, damit er nicht funktioniert. Ich habe ein paar Ideen, wie zum Beispiel eine Unterklasse zum Testen zu erstellen, aber nicht glücklich mit beiden. Also wolltest du mir eine bessere Arbeit vorschlagen?

Antwort

0

Ein Ansatz besteht darin, verschiedene Profile für Entwicklung, Integrationstest und Produktion zu verwenden und die verschiedenen Komponenten und Ihre Integrationstestklasse entsprechend zu kommentieren.

@Component 
@Profile("it") 
public class MessageReceiverIT { 

    @JmsListener(destination = "mailbox", containerFactory = "myFactory") 
    public void receiveMessage(SimpleMessage email) { 
     log.info("Integration test pretend to receive {}", email); 
// (...) 

Dies ist der Integrationstest, der die gleiche Anwendungsklasse wie die reale Anwendung verwendet, aber wenn eine Nachricht die MessageReceiverIT.receiveMessage() Methode anstelle der Produktionskomponente aufgerufen empfangen wird: Auch

@RunWith(SpringRunner.class) 
@SpringBootTest(classes=Application.class) 
@ActiveProfiles("it") 
public class JmsIntegrationTest { 

    @Inject 
    ConfigurableApplicationContext context; 

    @Test 
    public void testSend() throws Exception{ 
     JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class); 
     jmsTemplate.convertAndSend("mailbox", new SimpleMessage("it", "we need more IT")); 
// (...) 

überprüfen aus Spring Boot Testing für alternative Ansätze wie die Verwendung von @TestConfiguration. Ich verwende Spring Boot in meinen Beispielen, aber es sollte ähnliche Ansätze geben, wenn Sie keine Spring-Boot-Anwendung haben.

+0

Eigentlich habe ich ähnliche Ansatz verwendet und aktive mq wie in der Warteschlange für die Speicher-Messaging verwendet. Erstellt zwei Profile, testen und prod von wo ich Dinge anders anzustoßen. – Imran