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
相关产品推荐
相关产品推荐

