Junit5中如何Mock或测试CMSConfig接口并解决注入实例为null问题
问题根因
- 你当前使用的
@ExtendWith(MockitoExtension.class)仅支持Mockito原生的@Mock、@InjectMocks、@Spy等注解,既不识别Spring的@Autowired注解,也不会处理自定义的@ManagedConfiguration注解,所以两个字段会出现null。 - CMSConfig是接口类型,本身没有实现类,要么通过Mockito生成Mock代理实例,要么启动Spring上下文让CMS框架生成对应动态代理Bean。
可选解决方案
方案一:纯Mockito单元测试(无需启动Spring,执行速度快,适合测试业务逻辑)
如果你只需要测试MockitoService的业务逻辑,不需要验证CMS配置的实际加载效果,用这个方案即可:
@ExtendWith(MockitoExtension.class) public class MockitoServiceTest { // 自动实例化被测类,将标注了@Mock的依赖注入进去 @InjectMocks private MockitoService mockitoService; // Mock CMSConfig接口的代理实例 @Mock private CMSConfig cmsConfig; @Test public void testMethod() { // 打桩定义CMS方法返回值 when(cmsConfig.getSomeConfig()).thenReturn("测试配置值"); // 执行测试方法 String result = mockitoService.method(); // 校验结果 assertEquals("Hello!测试配置值", result); } }
方案二:Spring上下文集成测试(适合验证CMS配置实际加载逻辑)
如果你需要验证CMS框架是否能正确读取配置并注入到CMSConfig实例中,需要启动Spring测试上下文:
@ExtendWith(SpringExtension.class) // 如果是SpringBoot项目直接加@SpringBootTest,否则指定你的Spring配置类 @SpringBootTest public class MockitoServiceTest { @Autowired private MockitoService mockitoService; @Autowired private CMSConfig cmsConfig; @BeforeAll public static void before() { // 建议测试配置放在test/resources目录下,和生产配置隔离 System.setProperty("cms.configs.dir", Paths.get("src", "test", "resources").toFile().getAbsolutePath()); } @Test public void testCMSConfigLoad() { // 校验实际加载的配置值是否符合预期 assertEquals(cmsConfig.getSomeConfig(),"你期望的配置值"); } @Test public void testServiceMethod() { String result = mockitoService.method(); assertEquals("Hello!你期望的配置值", result); } }
注意:你原测试代码中调用的
getDummy()方法在贴出的CMSConfig接口中没有定义,需要确认是笔误还是确实存在该方法,避免编译报错。
使用方案二需要确保你的CMS框架自带Spring自动配置逻辑,能识别@ManagedConfiguration注解并为CMSConfig接口生成动态代理Bean注入到Spring上下文。如果没有相关自动配置,需要手动编写配置类注册CMSConfig的代理实例。
内容的提问来源于stack exchange,提问作者Java Noob
相关产品推荐
相关产品推荐

