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