如何使用 Mockito 为 page.map(mapper::toDto) 模拟 Mapstruct 的 toDto 方法
How to mock Mapstruct's toDto method using Mockito for page.map(mapper::toDto)
我正在为我的 service
方法编写一个 junit
测试用例,它有一个对 jpa repository
的外部调用,我想 mock
.
此方法 findall(Pageable pageable)
return 是一个 page
实体,由 Mapstruct's
映射器映射。
但是,当我 assert
return 时,我得到一个 NPE
。
可能有一些我遗漏的东西,我不确定如何 mock
这个方法调用。
我试过这样写测试用例
测试用例:
public class myTestclass {
@Test
public void testFindAllUser() {
User user1 = new User();
user1.setId(Long.valueOf(1));
User user2 = new User();
user2.setId(Long.valueOf(2));
List<User> userList = new ArrayList<>();
userList.add(user1);
userList.add(asset2);
Pageable pageable = PageRequest.of(0, 5);
Page<User> userPage = new PageImpl<>(userList, pageable, userList.size());
Page<UserDto> userDtoPage = null;
Mockito.when(userRepositoryMock.findAll(pageable)).thenReturn(userPage);
Mockito.when(userPage.map(userMapperMock::toDto)).thenReturn(userDtoPage);// expecting to mock this object in
// some other way.
assertThat(userService.findAll(pageable)).isEqualTo(userDtoPage); // throws NPE
}
}
我正在编写测试用例的方法:
public Page<UserDto> findAll(Pageable pageable)
{
return userRepository.findAll(pageable).map(userMapper::toDto);
}
这是我的映射器class:
@Mapper(componentModel = "spring", uses = { FarmerMapper.class })
public interface UserMapper extends EntityMapper<UserDto, User> {
UserDto toDto(User user);
User toEntity(UserDto userDto);
}
模拟 mapper
方法 toDto
使其 return 成为 userDto
的一页的正确方法是什么?
由于.map
使用UserMapper's toDto
方法来转换页面的每个元素,所以我mock了userMapper
的多个元素来解决这个问题。
因此我创建了 2 个页面,一个用于 User
,另一个用于 UserDto
。
所以我的测试用例被修改为
@Test
public void testFindAllUser() {
User user1 = new User();
user1.setId(DEFAULT_ID);
User user2 = new User();
user2.setId(2L);
List<User> userList = new ArrayList<>();
userList.add(user1);
userList.add(user2);
Pageable pageable = PageRequest.of(0, 5);
Page<User> userPage = new PageImpl<>(userList, pageable, userList.size());
UserDto userDto1 = new UserDto();
userDto1.setId(Long.valueOf(1));
UserDto userDto2 = new UserDto();
userDto2.setId(Long.valueOf(2));
List<UserDto> userDtoList = new ArrayList<>();
userDtoList.add(userDto1);
userDtoList.add(userDto2);
Page<UserDto> userDtoPage = new PageImpl<>(userDtoList, pageable, userDtoList.size());
Mockito.when(userMapperMock.toDto(user1)).thenReturn(userDto1);
Mockito.when(userMapperMock.toDto(user2)).thenReturn(userDto2); //Mocking the toDto method.
Mockito.when(userRepositoryMock.findAll(pageable)).thenReturn(userPage);
assertThat(userService.findAll(pageable)).isEqualTo(userDtoPage);
}
现在,如果要添加到页面的元素数量更多,我会为所有元素模拟相同的 toDto
。
我正在为我的 service
方法编写一个 junit
测试用例,它有一个对 jpa repository
的外部调用,我想 mock
.
此方法 findall(Pageable pageable)
return 是一个 page
实体,由 Mapstruct's
映射器映射。
但是,当我 assert
return 时,我得到一个 NPE
。
可能有一些我遗漏的东西,我不确定如何 mock
这个方法调用。
我试过这样写测试用例 测试用例:
public class myTestclass {
@Test
public void testFindAllUser() {
User user1 = new User();
user1.setId(Long.valueOf(1));
User user2 = new User();
user2.setId(Long.valueOf(2));
List<User> userList = new ArrayList<>();
userList.add(user1);
userList.add(asset2);
Pageable pageable = PageRequest.of(0, 5);
Page<User> userPage = new PageImpl<>(userList, pageable, userList.size());
Page<UserDto> userDtoPage = null;
Mockito.when(userRepositoryMock.findAll(pageable)).thenReturn(userPage);
Mockito.when(userPage.map(userMapperMock::toDto)).thenReturn(userDtoPage);// expecting to mock this object in
// some other way.
assertThat(userService.findAll(pageable)).isEqualTo(userDtoPage); // throws NPE
}
}
我正在编写测试用例的方法:
public Page<UserDto> findAll(Pageable pageable)
{
return userRepository.findAll(pageable).map(userMapper::toDto);
}
这是我的映射器class:
@Mapper(componentModel = "spring", uses = { FarmerMapper.class })
public interface UserMapper extends EntityMapper<UserDto, User> {
UserDto toDto(User user);
User toEntity(UserDto userDto);
}
模拟 mapper
方法 toDto
使其 return 成为 userDto
的一页的正确方法是什么?
由于.map
使用UserMapper's toDto
方法来转换页面的每个元素,所以我mock了userMapper
的多个元素来解决这个问题。
因此我创建了 2 个页面,一个用于 User
,另一个用于 UserDto
。
所以我的测试用例被修改为
@Test
public void testFindAllUser() {
User user1 = new User();
user1.setId(DEFAULT_ID);
User user2 = new User();
user2.setId(2L);
List<User> userList = new ArrayList<>();
userList.add(user1);
userList.add(user2);
Pageable pageable = PageRequest.of(0, 5);
Page<User> userPage = new PageImpl<>(userList, pageable, userList.size());
UserDto userDto1 = new UserDto();
userDto1.setId(Long.valueOf(1));
UserDto userDto2 = new UserDto();
userDto2.setId(Long.valueOf(2));
List<UserDto> userDtoList = new ArrayList<>();
userDtoList.add(userDto1);
userDtoList.add(userDto2);
Page<UserDto> userDtoPage = new PageImpl<>(userDtoList, pageable, userDtoList.size());
Mockito.when(userMapperMock.toDto(user1)).thenReturn(userDto1);
Mockito.when(userMapperMock.toDto(user2)).thenReturn(userDto2); //Mocking the toDto method.
Mockito.when(userRepositoryMock.findAll(pageable)).thenReturn(userPage);
assertThat(userService.findAll(pageable)).isEqualTo(userDtoPage);
}
现在,如果要添加到页面的元素数量更多,我会为所有元素模拟相同的 toDto
。