2017-08-04 185 views
0

我正在嘗試編寫一個JMS服務的集成測試,它看起來像這樣。JMS集成測試

@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){ 
    ............... 
} 

首先,我可以嘲笑這一些怎麼樣?我試圖嘲笑它,但是當我發送消息時,spring啓動應用程序正在調用實際的JMS bean而不是模擬的。似乎這是不可能的。 即使這是不可能的,我是否可以至少調用bean並以某種方式檢查receiveMessage方法是否被調用。而且,如果它被調用,sendEmail部分應該是僞造的,這樣它就不會做任何工作。我有一些想法,比如創建一個用於測試的子類,但對其中的任何一個都不滿意。所以想要如果你可以建議我一個更好的解決辦法?

回答

0

一種方法是針對開發,集成測試和生產使用不同的配置文件,並相應地對不同的組件和集成測試類進行註釋。

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

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

這是使用相同的應用程序類作爲實際應用的集成測試,但如果接收到消息中的MessageReceiverIT.receiveMessage()方法將被調用,而不是製造組分:

@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")); 
// (...) 

還檢查出Spring Boot Testing替代方法,如使用@TestConfiguration。我在示例中使用了Spring Boot,但如果您沒有Spring Boot Application,則應該有類似的方法。

+0

實際上,我使用了類似的方法,並在內存消息隊列中使用了活動的mq。創建了兩個配置文件,測試和從哪裏啓動不同的東西。 – Imran