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

Quarkus:使用Mockito扩展时@Inject Logger触发测试NPE,@QuarkusTest正常

解决Mockito单元测试中@Inject注入JBoss Logger导致的NullPointerException问题

问题场景

  • 业务代码通过@Inject注入org.jboss.logging.Logger
  • 在标记@ExtendWith(MockitoExtension.class)的单元测试中,用Mockito原生@Mock标注Logger字段时,会触发NullPointerException
  • 改用@QuarkusTest并通过@Inject注入Logger时能正常运行,但不想为了Logger单独切换测试类型

解决方案

1. 直接使用真实Logger实例(无需Mock)

Logger作为日志组件,多数测试场景下不需要Mock,直接初始化真实实例即可避免空指针:

@ExtendWith(MockitoExtension.class)
public class YourServiceTest {
    // 直接初始化真实Logger实例
    private Logger logger = Logger.getLogger(YourService.class);

    @InjectMocks
    private YourService service;

    @BeforeEach
    void setUp() {
        // 将Logger手动注入到被测试对象中
        service.logger = logger;
    }

    // 测试方法...
}

2. 用Mockito的@Spy替代@Mock

Spy可以包装真实Logger对象,既保留原有日志行为,又能在需要时Mock特定方法,避免空指针:

@ExtendWith(MockitoExtension.class)
public class YourServiceTest {
    @Spy
    private Logger logger = Logger.getLogger(YourService.class);

    @InjectMocks
    private YourService service;

    // 测试方法...
}

3. 使用Quarkus官方Mockito扩展的@InjectMock

Quarkus提供了适配自身DI的Mockito扩展,用io.quarkus.test.junit.mockito.InjectMock替代原生@Mock,能正确处理Logger的注入逻辑:

import io.quarkus.test.junit.mockito.InjectMock;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
public class YourServiceTest {
    @InjectMock
    private Logger logger;

    @InjectMocks
    private YourService service;

    // 测试方法...
}

关于关联问题的说明

你提到的Stack Overflow问题(主题为“Mock Quarkus提供的Logger”)和当前问题完全相关,该问题的核心场景与解决方案和你遇到的一致,比如推荐使用Quarkus的InjectMock替代原生Mockito的Mock,或者直接使用真实Logger实例,都是针对Quarkus环境下Mockito处理JBoss Logger注入的适配方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:15:35