【问题标题】:How to inject mapper (mapstruct) to Junit test with SpringJUnit4ClassRunner如何使用 SpringJUnit4ClassRunner 将映射器(mapstruct)注入到 Junit 测试中
【发布时间】:2020-06-10 12:28:22
【问题描述】:

我在为 SpringJUnit4ClassRunner.class 配置测试时遇到问题)。 我的问题是因为我的 map 结构中的映射器在到达时返回 null。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
class UserServiceTestSuite {
    @Spy
    private UserDto userDto;
    @Spy
    private UserMapper userMapper;
    @Mock
    private UserRepository userRepository;
    @InjectMocks
    private UserService userService;

    private User createUser() {
        return User.builder()
                .firstName("Steve")
                .lastName("Jobs")
                .login("SteveJobs")
                .password("password")
                .role(UserRole.ROLE_ADMIN)
                .build();

    }

    @Test
    public void testCreateUser() {
        //Given
        User user = createUser();
        Mockito.when(userRepository.save(user)).thenReturn(user);
        //When
        UserDto userDto = userService.createUser(userMapper.mapToUserDto(user));
        Long id = userDto.getId();
        //Then
        Assert.assertEquals("Steve", userDto.getFirstName());
        Assert.assertEquals("Jobs", userDto.getLastName());
        Assert.assertEquals("SteveJobs", userDto.getLogin());
        Assert.assertEquals("ROLE_ADMIN", userDto.getRole());
    }

【问题讨论】:

    标签: java testing mapstruct


    【解决方案1】:

    在我看来你有两个选择:

    1. 通过@SpringBootTest(classes = {UserMapperImpl.class})
      @Autowired private UserMapper userMapper; 注入映射器
    2. 只需初始化 Mapper private UserMapper userMapper = new UserMapperImpl()(并删除 @Spy

    使用第二种方法时,您甚至可以删除 @SpringBootTest,因为在给定的 sn-p 中您不需要 Spring 上下文(由注释创建)。
    @RunWith(MockitoJUnitRunner.class) 可用于自动注入对象用@Mock 注释到您的UserService 中。在不创建 Spring 上下文的情况下编写单元测试有助于缩短测试套件的执行时间。

    【讨论】:

    • 使用第一个解决方案,我得到:无法加载 ApplicationContext java.lang.IllegalStateException:无法加载 ApplicationContext。第二个我得到 ava.lang.NoClassDefFoundError: Could not initialize class :(
    【解决方案2】:
    public interface UserMapper {
        UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
        UserDTO userMapper.mapToUserDto(Object value);
    }
    

    使用此映射器接口,您可以从模拟实例化并使用方法。 例如:

    @Mock
    private UserMapper userMapper;
    

    初始化模拟:

    @Before
    public void setUp() {
       MockitoAnnotations.initMocks(this);
    }
    

    你使用调用 INSTANCE

    UserDto userDto = userService.createUser(userMapper.INSTANCE.mapToUserDto(user));
    

    【讨论】:

    • 用 MockitoAnotationns 初始化模拟,让我更新代码。
    猜你喜欢
    • 1970-01-01
    • 2023-01-15
    • 2019-05-05
    • 2017-12-29
    • 2017-11-03
    • 1970-01-01
    • 2021-01-04
    • 2020-06-04
    • 1970-01-01
    相关资源
    最近更新 更多