我在为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());
}
答案 0 :(得分:0)
我认为您有两种选择:
@SpringBootTest(classes = {UserMapperImpl.class})
和@Autowired
private UserMapper userMapper;
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));