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

标签 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());
    }

最佳答案

我认为你有两个选择:

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

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

关于java - 如何使用 SpringJUnit4ClassRunner 将映射器(mapstruct)注入(inject)到 Junit 测试中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62287588/

相关文章:

java - Java中的for循环捕获异常

初始化上下文时java.lang.NoClassDefFoundError : org. springframework.beans.FatalBeanException

java - 用于楼宇管理系统的 BACNet 插件

javascript - 是否有任何自动化脚本可以让我们快速验证标签?

javascript - Faker.js 困惑

java - 如何在 mapstruct 中使用来自不同类的另一个映射

java - JCIFS NTLM 库的替代品

angularjs - 如何在注入(inject)前模拟 Angular 模块?

spring-boot - SpringBoot + Lombok + MapStruct 不能一起工作

java - 无法使用 Mapstruct 生成没有输入参数的映射方法