2017-08-04 159 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