I have 2 beans with the same class. They are running fine but fails to run on Unit Test
@Configuration
public class RabbitmqConfig {
@Bean("rabbitmqConnectionFactoryLocal")
//@Qualifier("rabbitmqConnectionFactoryLocal")
public CachingConnectionFactory rabbitmqConnectionFactoryLocal(
@Value("${spring.rabbitmq.local.host}") String host,
@Value("${spring.rabbitmq.port}") int port,
@Value("${spring.rabbitmq.virtual-host}") String virtualHost) {
//skip code here
}
@Bean("rabbitmqConnectionFactoryRemote")
//@Qualifier("rabbitmqConnectionFactoryRemote")
public CachingConnectionFactory rabbitmqConnectionFactoryRemote(
@Value("${spring.rabbitmq.remote.host}") String host,
@Value("${spring.rabbitmq.port}") int port,
@Value("${spring.rabbitmq.virtual-host}") String virtualHost) {
//skip code here
}
//@Bean(name = "rabbitmqTemplateLocal")
@Bean
@Qualifier("rabbitmqTemplateLocal")
public RabbitTemplate rabbitmqTemplateLocal(@Qualifier("rabbitmqConnectionFactoryLocal") ConnectionFactory connectionFactory) {
//skip code here
}
//@Bean(name = "rabbitmqTemplateRemote")
@Bean
@Qualifier("rabbitmqTemplateRemote")
public RabbitTemplate rabbitmqTemplateRemote(@Qualifier("rabbitmqConnectionFactoryRemote") ConnectionFactory connectionFactory) {
//skip code here
}
}
@Slf4j
@RestController
@RequestMapping(value = "/v1/messages")
public class MessageController {
//@Resource(name="rabbitmqTemplateLocal")
@Autowired
@Qualifier("rabbitmqTemplateLocal")
private RabbitTemplate rabbitmqTemplateLocal;
//@Resource(name="rabbitmqTemplateRemote")
@Autowired
@Qualifier("rabbitmqTemplateRemote")
private RabbitTemplate rabbitmqTemplateRemote;
@GetMapping("/ping")
public String ping() {
return "pong";
}
//skip code here
}
When I run following Unit Test, I got the error message
No qualifying bean of type 'org.springframework.amqp.rabbit.core.RabbitTemplate' available: expected single matching bean but found 2: rabbitmqTemplateLocal,rabbitmqTemplateRemote
No qualifying bean of type 'org.springframework.amqp.rabbit.connection.ConnectionFactory' available: expected single matching bean but found 2: rabbitmqConnectionFactoryRemote,rabbitmqConnectionFactoryLocal
(The Code itself is running fine, but not the Unit Test)
@SpringBootTest
@AutoConfigureMockMvc
@TestPropertySource(locations = "classpath:application-test.properties")
class MessageControllerTest {
@Autowired
private MockMvc mvc;
//@MockBean (name = "rabbitmqTemplateLocal")
//private RabbitTemplate rabbitmqTemplateLocal;
//@MockBean (name = "rabbitmqTemplateRemote")
//private RabbitTemplate rabbitmqTemplateRemote;
@Test
@DisplayName("Get /ping return success")
void whenPingRequest_thenReturnPongMessage() throws Exception {
mvc.perform(get("/v1/messages/ping"))
.andExpect(status().isOk())
.andExpect(content().string(containsString("pong")));
}
}
How to make this Unit Test run? Tried the @Bean and @Resource combo and got the same error. Also tried @MockBean in test file and got the same error.