JUnit5 Mockito测试实例化UserPojo报构造函数未定义异常
问题原因
编译报错本质是类型不匹配:UserPojo全参构造的第8个参数定义为LocalDateTime类型,但你初始化对象时直接传入了字符串值"2022-06-25T22:37:24.894"。Java是强类型语言,String和LocalDateTime不存在隐式转换,编译器找不到参数列表匹配的构造方法,就会抛出构造函数未定义的错误。UserEntity的初始化代码存在完全相同的问题。
修复方法
测试场景下传入LocalDateTime类型参数不需要特殊配置,只需要把日期值显式转为LocalDateTime实例再传入构造函数即可,常用两种写法:
- 固定时间值:用
LocalDateTime.parse()解析预设的日期字符串,适合后续断言需要严格匹配时间的场景 - 动态时间值:用
LocalDateTime.now()取测试运行时的当前时间,适合不需要校验具体时间字段的场景
修正后的测试初始化代码
@ExtendWith(MockitoExtension.class) public class LoginAndRegisterTest { @Mock UserDao userDao; @InjectMocks UserServiceImpl userService; private UserPojo expectedPojo; private UserEntity dummyEntity; @BeforeEach public void setup() { // 解析字符串得到LocalDateTime实例 LocalDateTime testRegisterTime = LocalDateTime.parse("2022-06-25T22:37:24.894"); expectedPojo = new UserPojo(1, "Goldendeep", "golden@coolkids.com", "333-343-3434", "golden", "kaur11", false, testRegisterTime, 2); // 若UserEntity对应字段也是LocalDateTime类型,同样传入解析后的实例,禁止直接传字符串 dummyEntity = new UserEntity(1, "Goldendeep", "golden@coolkids.com", "333-343-3434", "golden", "kaur11", false, testRegisterTime, 2); } }
补充说明:如果你使用的日期字符串不是默认支持的ISO标准格式(即
yyyy-MM-ddTHH:mm:ss.SSS),需要自定义格式化器匹配字符串格式,示例如下:// 匹配yyyy-MM-dd HH:mm:ss格式的日期字符串 DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime customTime = LocalDateTime.parse("2022-06-25 22:37:24", customFormatter);
内容的提问来源于stack exchange,提问作者Joshua Hebert
相关产品推荐
相关产品推荐

