单元测试第二篇,演示在单元测试时,RabbitMQ生产者和消费者的mock。
相关代码已经放在Github上:源代码
要注意的是,因为不是真实的消息队列中间件,只是进程内mock,
因此,生产的消息无法被其它服务(进程)消费,消费者也无法收到真实的MQ消息。
下面简述开发过程:
1、首先,还是正常建立项目,并有常规的生产消息或消费消息的业务逻辑;
2、项目添加mock库的引用,打开pom.xml,添加:
<dependency>
<groupId>com.github.fridujo</groupId>
<artifactId>rabbitmq-mock</artifactId>
<version>1.1.1</version>
<scope>test</scope>
</dependency>
注:scope为test,是仅在单元测试时引入,运行时并不引入。
3、application.yml配置文件无需修改,会自动在Bean生成拦截。
注:为保险起见,建议新建unittest的配置节,把mq的ip改掉,避免mock不生效,导致误发或报错
4、在单元测试的package下新建配置类,拦截RabbitMQ的拦截类:
@Configuration
public class MockRabbitConfig {
@Bean
ConnectionFactory connectionFactory() {
return new CachingConnectionFactory(new MockConnectionFactory());
}
}
5、好了,现在可以直接对项目进行测试了,所有的生产者消息,都会发到内存,而不会到真正的RabbitMQ。
如果项目里有消费者,消费自己项目里生产的消息,也能正常收到消息,并消费。
如果你在运行时有问题,可以下载上面的源码,进行对比,看看你的代码哪里有问题。
注1:如果你的项目只有消费者,那必须在测试代码里添加发布消息的逻辑,比如:
@AutoWired
RabbitTemplate template;
template.convertAndSend("exchange名字", "routingKey名字", obj);
注2:如果你的项目只有生产者,则可以在测试代码里添加消费判断逻辑,比如:
@AutoWired
RabbitTemplate template;
Message msg = template.receive("queue名字");
String msgBody = new String(msg.getBody());