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

时间:2020-06-09 16:39:07

标签: java testing mapstruct

我在为SpringJUnit4ClassRunner.class配置测试时遇到问题。 我的问题是因为我的地图结构映射器到达时返回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());
    }

2 个答案:

答案 0 :(得分: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上下文的情况下编写单元测试有助于降低测试套件的执行时间。

答案 1 :(得分:0)

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));