You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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);
    }
}

问题根源说明

  1. 你之前直接new MyHealthIndicator(),跳过了Spring的依赖注入流程,导致jmsConsumersList字段未被赋值,始终为null。
  2. 测试类中定义的@Bean未被Spring上下文加载,因为测试类未配置为Spring配置类,也未启用上下文。

内容的提问来源于stack exchange,提问作者brian8267

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:20:38