Mockito测试提示入参为null,@Value注入的yml配置属性未生效是什么原因?
报错原因
- 调用对象错误:
methodX()是ClassA的成员方法,你的测试代码中错误调用了serviceB.methodX(),属于低级逻辑错误。 @Value注入失效:普通单元测试默认不会启动Spring上下文,也不会自动加载yml配置文件,@Value("${attr.value}")的取值逻辑不会触发,构造ClassA时attr参数会被传入null,最终调用serviceB.process(attr)时传入的就是null,和你stub预设的参数"XXX"不匹配,触发严格存根参数不匹配报错。- 测试用例初始化逻辑缺失:你没有手动初始化
ClassA并传入测试需要的attr值,也没有添加Spring测试相关注解加载配置,导致属性没有正确赋值。
解决方案
方案1:使用Mockito做纯单元测试(不启动Spring上下文,速度快)
手动构造ClassA实例,直接传入测试用的attr值,不需要依赖Spring注入:
@ExtendWith(MockitoExtension.class) public class ClassATest { // 模拟ServiceB依赖 @Mock private ServiceB serviceB; private ClassA classA; @BeforeEach void init() { // 手动传入测试预设的attr值"XXX" classA = new ClassA(serviceB, "XXX"); } @Test public void testMethodX() throws Exception { doNothing().when(serviceB).process(eq("XXX")); // 正确调用ClassA的methodX classA.methodX(); verify(serviceB).process(eq("XXX")); } }
方案2:启动Spring上下文做集成测试(会加载yml配置)
如果需要验证配置注入逻辑,可以添加Spring测试注解,加载上下文和配置:
@SpringBootTest public class ClassAIntegrationTest { // 自动注入ClassA,Spring会自动从yml中读取attr.value赋值 @Autowired private ClassA classA; // 模拟ServiceB,避免调用真实业务逻辑 @MockBean private ServiceB serviceB; @Test public void testMethodX() throws Exception { // 此处eq的参数需要和yml中配置的attr.value值一致 doNothing().when(serviceB).process(eq("XXX")); classA.methodX(); verify(serviceB).process(eq("XXX")); } }
内容的提问来源于stack exchange,提问作者jimmy
相关产品推荐
相关产品推荐

