我有一个服务负责在RabbitMQ队列上放置消息。我已经设置了AMQP配置,以便我可以将AmqpTemplate类自动装入服务中。当我将逻辑移动到JUnit测试的主体中时,此配置有效。
但是,当我使用自动装配的服务创建测试并调用方法来触发AmqpTemplates convertAndSend方法时,没有任何反应。使用wireshark我已经看到它仍然与RabbitMQ服务器握手,但是没有创建交换,即使我正在使用RabbitMQ的firehose跟踪选项,也没有消息出现在任何队列中。
代码如下:
<!-- AMQP messaging configurations starts here -->
<!-- Spring AMQP connection factory -->
<rabbit:connection-factory id="connectionFactory"
host="localhost"
port="5672"
username="guest"
password="guest"
channel-cache-size="25"/>
<!-- Queues -->
<rabbit:queue name="test.queue"/>
<!-- Exchanges with their queue bindings -->
<rabbit:topic-exchange name="test.exchange">
<rabbit:bindings>
<rabbit:binding queue="test.queue" pattern="test.*"/>
</rabbit:bindings>
</rabbit:topic-exchange>
<!-- Spring AMQP template - Creates a bean which can send a message to the topicExchange-->
<rabbit:template id="testTemplate"
connection-factory="connectionFactory"
exchange="test.exchange"/>
<!-- Spring AMQP Admin -->
<rabbit:admin connection-factory="connectionFactory"/>
上面的代码段出现在我的应用程序上下文中,用于JUnit测试。
@Service
public class AsyncQueueServiceImplementation implements AsyncQueueService
{
@Autowired
private AmqpTemplate template;
@Override
@Async
public void publish()
{
template.convertAndSend("test.debug", "test payload");
}
}
上面的代码段是负责实际将对象发送到AmqpTemplate的服务。请注意,AmqpTemplate在这里是自动装配的。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:application-context-unitTests.xml" })
public class AsyncTraceServiceImplementationTest
{
@Autowired
AsyncTraceService traceService;
@Test
public void testPublishAtDebugLevel()
{
traceService.publish();
}
}
以上段是JUnit测试。它使用包含所有rabbit mq配置的应用程序上下文。然后它在服务中自动装配并调用该消息。
当我放置简单的System.out.println时,我可以看到AmqpTemplate在服务中都被实例化但似乎没有做到预期的事情。
这可能是由于某种原因没有传递给服务的上下文的问题。
我尝试使用ReflectionTestUtils从Junit测试中设置服务中的模板字段,但我无法这样做。
答案 0 :(得分:0)
我成功解决了这个问题。
问题出在我正在使用的RabbitMQ主题中。交流收到了一个未知的主题,因此没有做任何事情。
更正此问题导致邮件出现在正确的队列中,因为交换机能够正确路由邮件。