如何使用SpringJUnit4ClassRunner将映射器(mapstruct)注入到Junit测试中

问题描述 投票:0回答:2

我在配置SpringJUnit4ClassRunner.class的测试时遇到问题。我的问题是因为到达mapstruct时,我的mapper返回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
2个回答
0
投票

我认为您有两个选择:

  1. 通过@SpringBootTest(classes = {UserMapperImpl.class})注入映射器,然后@Autowired private UserMapper userMapper;
  2. 简单地初始化映射器private UserMapper userMapper = new UserMapperImpl()(并删除@Spy

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


0
投票
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
    UserDTO userMapper.mapToUserDto(Object value);
}

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

@Mock
private UserMapper userMapper;

您使用呼叫INSTANCE] >>

UserDto userDto = userService.createUser(userMapper.INSTANCE.mapToUserDto(user));
    
© www.soinside.com 2019 - 2024. All rights reserved.