如何在Spring单元测试中用自定义测试Bean覆盖命名List Bean?
解决Spring List类型命名Bean的单元测试注入问题
你的核心问题在于直接new MyHealthIndicator()导致Spring依赖注入失效,jmsConsumersList字段始终为null。以下是两种可行的解决方案:
方案一:轻量纯Mockito测试(无需启动Spring上下文)
这种方式不需要加载Spring容器,直接手动注入依赖,测试速度快。
@ExtendWith(MockitoExtension.class) public class MyHealthIndicatorTest { private MyHealthIndicator myHealthIndicator; @Mock private JmsConsumer jmsConsumer1; @Mock private JmsConsumer jmsConsumer2; @BeforeEach public void setup() { // 构造填充了Mock的List List<JmsConsumer> mockConsumers = Arrays.asList(jmsConsumer1, jmsConsumer2); // 利用@RequiredArgsConstructor生成的构造器直接注入 myHealthIndicator = new MyHealthIndicator(mockConsumers); } @Test public void testStatusUpAll() { // 配置Mock行为 Mockito.when(jmsConsumer1.getAlias()).thenReturn("jmsConsumer1"); Mockito.when(jmsConsumer1.isConnected()).thenReturn(true); Mockito.when(jmsConsumer2.getAlias()).thenReturn("jmsConsumer2"); Mockito.when(jmsConsumer2.isConnected()).thenReturn(true); Health healthCheck = myHealthIndicator.health(); assertEquals(healthCheck.getStatus(), Status.UP); // 验证详情内容 assertEquals(healthCheck.getDetails().get("jmsConsumer1"), true); assertEquals(healthCheck.getDetails().get("jmsConsumer2"), true); } }
方案二:Spring Boot Test上下文替换原Bean
如果需要依赖Spring上下文(比如要测试条件注解、Bean加载逻辑),可以启动精简上下文并替换原Bean:
@SpringBootTest(classes = {MyHealthIndicator.class}) @ContextConfiguration(classes = MyHealthIndicatorTest.TestConfig.class) public class MyHealthIndicatorTest { @Autowired private MyHealthIndicator myHealthIndicator; @Mock private JmsConsumer jmsConsumer1; @Mock private JmsConsumer jmsConsumer2; // 测试配置类,替换原"FooConsumers" Bean @Configuration static class TestConfig { @Bean(name = "FooConsumers") List<JmsConsumer> messageConsumers() { return Arrays.asList(jmsConsumer1, jmsConsumer2); } } @Test public void testStatusUpAll() { Mockito.when(jmsConsumer1.getAlias()).thenReturn("jmsConsumer1"); Mockito.when(jmsConsumer1.isConnected()).thenReturn(true); Mockito.when(jmsConsumer2.getAlias()).thenReturn("jmsConsumer2"); Mockito.when(jmsConsumer2.isConnected()).thenReturn(true); Health healthCheck = myHealthIndicator.health(); assertEquals(healthCheck.getStatus(), Status.UP); } }
问题根源说明
- 你之前直接
new MyHealthIndicator(),跳过了Spring的依赖注入流程,导致jmsConsumersList字段未被赋值,始终为null。 - 测试类中定义的
@Bean未被Spring上下文加载,因为测试类未配置为Spring配置类,也未启用上下文。
内容的提问来源于stack exchange,提问作者brian8267
相关产品推荐
相关产品推荐

