MapStruct映射器测试报错:ParameterResolutionException问题求助
问题分析与解决
报错信息(中文翻译)
org.junit.jupiter.api.extension.ParameterResolutionException: 没有为构造函数[public com.asd.mapper.UserToUserDTOMapperTest(com.asd.mapper.UserToUserDTOMapper)]中的参数[final com.asd.mapper.UserToUserDTOMapper mapper]注册参数解析器
问题原因
测试类通过@RequiredArgsConstructor尝试注入MapStruct生成的Spring Bean,但JUnit 5默认不会启动Spring容器,无法识别并注入Spring管理的Bean,导致找不到参数解析器。
解决方案
方案一:启用Spring测试上下文(适合整合Spring环境的测试)
给测试类添加@SpringBootTest注解,让JUnit启动Spring容器,自动注入MapStruct生成的Bean:
import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import static org.junit.jupiter.api.Assertions.*; @SpringBootTest @RequiredArgsConstructor class UserToUserDTOMapperTest { private final UserToUserDTOMapper mapper; String NAME = "asd"; String EMAIL = "asd@gmail.com"; @Test public void testMapUserToUserDTO() { User user = User.builder().name(NAME).email(EMAIL).build(); UserDTO userDTO = mapper.mapUserToUserDTO(user); assertNotNull(userDTO); assertEquals(NAME, userDTO.getName()); assertEquals(EMAIL, userDTO.getEmail()); } }
方案二:手动实例化MapStruct实现类(轻量测试,仅验证映射逻辑)
MapStruct会自动生成名为UserToUserDTOMapperImpl的实现类,直接手动实例化即可,无需依赖Spring容器:
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class UserToUserDTOMapperTest { private final UserToUserDTOMapper mapper = new UserToUserDTOMapperImpl(); String NAME = "asd"; String EMAIL = "asd@gmail.com"; @Test public void testMapUserToUserDTO() { User user = User.builder().name(NAME).email(EMAIL).build(); UserDTO userDTO = mapper.mapUserToUserDTO(user); assertNotNull(userDTO); assertEquals(NAME, userDTO.getName()); assertEquals(EMAIL, userDTO.getEmail()); } }
内容的提问来源于stack exchange,提问作者user1379280
相关产品推荐
相关产品推荐

