繁体   English   中英

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

[英]How to inject mapper (mapstruct) to Junit test with SpringJUnit4ClassRunner

我在为 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());
    }

在我看来,你有两种选择:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM