不使用Mock编写JUnit5测试void返回值setValue方法的问题求助
问题排查与修复方案
核心问题根因
- 测试方法未添加JUnit5的
@Test注解,JUnit框架无法识别该方法为测试用例,不会按测试逻辑执行 - 未显式指定
PersonInfo的fullname属性为null,若该属性有默认非空初始值,会导致if (a.getFullname() == null)判断不通过,不会执行给Person赋值的逻辑 - 直接使用
@Autowired注入类A,若未启动Spring测试上下文会导致A实例为null,调用方法时报空指针;纯单元测试不需要依赖Spring能力,直接实例化类A即可 - 断言方法写法错误,JUnit5的相等断言是
org.junit.jupiter.api.Assertions.assertEquals,原代码写的assertEqual缺少字母s,且未导入对应断言工具类
修正后的测试代码
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; class TestClass { // 直接实例化被测类,无需Mock和Spring注入 private final A a = new A(); @Test void testValue() { Person p = new Person(); PersonInfo pi = new PersonInfo(); // 显式设置fullname为null,保证条件分支触发 pi.setFullname(null); pi.setFirstName("TEST"); a.setValue(pi, p); assertEquals("TEST", p.getFullName()); } }
额外校验点
- 确认
Person、PersonInfo类的getter、setter方法与属性名匹配,比如PersonInfo的getFullname()对应属性是否正确、Person的setFullName()是否可以正常给属性赋值 - 若测试仍不通过,可在
setValue方法的if分支内添加临时日志或断点调试,确认分支是否被正常触发
内容的提问来源于stack exchange,提问作者r-developer
相关产品推荐
相关产品推荐

