Java 如何模拟Mapstruct';对page.map使用Mockito的toDto方法(mapper::toDto)
我正在为我的Java 如何模拟Mapstruct';对page.map使用Mockito的toDto方法(mapper::toDto),java,junit,java-8,mockito,mapstruct,Java,Junit,Java 8,Mockito,Mapstruct,我正在为我的服务方法编写一个junit测试用例,该方法具有对jpa存储库的外部调用,我希望mock 此方法findall(Pageable Pageable)返回由Mapstruct的mapper映射的实体的page。 但是,当我断言返回时,我得到了一个NPE。 我可能缺少一些东西,我不确定如何mock此方法调用 我试着这样写测试用例 测试用例: public class myTestclass { @Test public void testFindAllUser() { User user1
服务方法编写一个junit
测试用例,该方法具有对jpa存储库的外部调用,我希望mock
此方法findall(Pageable Pageable)
返回由Mapstruct的
mapper映射的实体的page
。
但是,当我断言返回时,我得到了一个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
}
}
公共类myTestclass{
@试验
public void testFindAllUser(){
用户user1=新用户();
user1.setId(Long.valueOf(1));
用户user2=新用户();
user2.setId(Long.valueOf(2));
List userList=new ArrayList();
userList.add(user1);
userList.add(asset2);
Pageable Pageable=PageRequest.of(0,5);
Page userPage=new PageImpl(userList,pageable,userList.size());
页面userDtoPage=null;
Mockito.when(userRepositoryMock.findAll(pageable)).thenReturn(userPage);
Mockito.when(userPage.map(userMapperMock::toDto)).thenReturn(userDtoPage);//希望在中模拟此对象
//另一种方式。
assertThat(userService.findAll(pageable)).isEqualTo(userDtoPage);//抛出NPE
}
}
我为其编写测试用例的方法:
public Page<UserDto> findAll(Pageable pageable)
{
return userRepository.findAll(pageable).map(userMapper::toDto);
}
公共页面findAll(可分页)
{
返回userRepository.findAll(pageable.map)(userMapper::toDto);
}
这是我的mapper类:
@Mapper(componentModel = "spring", uses = { FarmerMapper.class })
public interface UserMapper extends EntityMapper<UserDto, User> {
UserDto toDto(User user);
User toEntity(UserDto userDto);
}
@Mapper(componentModel=“spring”,使用={FarmerMapper.class})
公共接口UserMapper扩展了EntityMapper{
UserDto toDto(用户用户);
用户到实体(UserDto UserDto);
}
模拟mapper
方法toDto
以返回userDto
页面的正确方法是什么?由于.map
使用UserMapper的toDto
方法转换页面的每个元素,我模拟了UserMapper
的多个元素来解决这个问题
因此,我创建了两个页面,一个用于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);
}
@测试
public void testFindAllUser(){
用户user1=新用户();
user1.setId(默认的\u ID);
用户user2=新用户();
user2.setId(2L);
List userList=new ArrayList();
userList.add(user1);
userList.add(user2);
Pageable Pageable=PageRequest.of(0,5);
Page userPage=new PageImpl(userList,pageable,userList.size());
UserDto userDto1=新的UserDto();
userDto1.setId(Long.valueOf(1));
UserDto userDto2=新的UserDto();
userDto2.setId(Long.valueOf(2));
List userDtoList=new ArrayList();
userDtoList.add(userDto1);
userDtoList.add(userDto2);
Page userDtoPage=new PageImpl(userDtoList,pageable,userDtoList.size());
Mockito.when(userMapperMock.toDto(user1)).thenReturn(userDto1);
Mockito.when(userMapperMock.toDto(user2)).thenReturn(userDto2);//模拟toDto方法。
Mockito.when(userRepositoryMock.findAll(pageable)).thenReturn(userPage);
assertThat(userService.findAll(pageable)).isEqualTo(userDtoPage);
}
现在,如果有更多的元素要添加到页面中,我会对所有元素模拟相同的toDto
由于.map
使用UserMapper的toDto
方法转换页面的每个元素,因此我模拟了UserMapper
的多个元素来解决这个问题
因此,我创建了两个页面,一个用于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);
}
@测试
public void testFindAllUser(){
用户user1=新用户();
user1.setId(默认的\u ID);
用户user2=新用户();
user2.setId(2L);
List userList=new ArrayList();
userList.add(user1);
userList.add(user2);
Pageable Pageable=PageRequest.of(0,5);
Page userPage=new PageImpl(userList,pageable,userList.size());
UserDto userDto1=新的UserDto();
userDto1.setId(Long.valueOf(1));
UserDto userDto2=新的UserDto();
userDto2.setId(Long.valueOf(2));
List userDtoList=new ArrayList();
userDtoList.add(userDto1);
userDtoList.add(userDto2);
Page userDtoPage=new PageImpl(userDtoList,pageable,userDtoList.size());
Mockito.when(userMapperMock.toDto(user1)).thenReturn(userDto1);
Mockito.when(userMapperMock.toDto(user2)).thenReturn(userDto2);//模拟toDto方法。
Mockito.when(userRepositoryMock.findAll(pageable)).thenReturn(userPage);
assertThat(userService.findAll(pageable)).isEqualTo(userDtoPage);
}
现在,如果有更多的元素要添加到页面中,我会对所有元素模拟相同的toDto
我认为问题不在于模仿toDto
方法。这部分对我来说似乎是正确的。我认为问题可能在于,您为方法findAll
在userRepositoryMock
上定义了一个mock,但随后在另一个对象userService
上调用了方法findAll
,而这个对象似乎没有在这个范围内定义。此外,从未调用模拟的方法userPage.map(…)
。你能更具体地解释一下问题是什么以及你需要什么吗?为了简单起见,我没有提到userMapper
的声明部分。它自动连接到userService
类。测试用例中的模拟语句给出了一个关于我试图实现什么的更好的想法<代码>Mockito.when(userRepositoryMock.findAll(pageable))。然后返回(userPage)代码>模拟运行正常的userRepositoryMock
的findAll。它返回Page
Mockito.when(userPage.map(userMapperMock::toDto)),然后返回(userDtoPage)
在理想情况下应该模拟toDto
方法,但它似乎不起作用。据我所知,您模拟的方法是错误的。调用When(userPage.map(userMapperMock::toDto)),然后返回(…)
您正在模拟方法map
而不是toDto