我应该模仿别人写的存储库。
我有一个接口IUserDetailsRepository
,它只是查询数据库以手动检索存储在其中的用户详细信息(finduser()
)(而不是通过创建用户方法)。方法finduser()
在辅助类中实现,并由服务类使用。该类具有调用finduser()
的getuser()方法。我该如何嘲笑这个?我应该模拟服务类并调用getuser()
还是我必须模拟助手类并调用存储库的finduser()
方法?
我坚持这个..因为我没有createuser如何模拟对象并注入。我完全糊涂了。请帮帮我。
如果有关于如何模拟的任何这样的编程结构,这将是非常有帮助的。
以下是代码
**********IUserDetails Repository************
@Repository
public interface IUserDetails
extends PagingAndSortingRepository<UserEntity,String>
{
@Query("select ud.id,ud.name,ud.unit from UserEntity u where ud.id=:id and ud.passwd=:passwd")
List<Object[]> findUserbyID(@Param("id") String id, @Param("passwd") String passwd);
}
*****UserHelper class*****
@Component
public class UserHelper{
@Autowired
private IUserDetails repo;
@Transactional(rollbackFor=(Exception.class);
@ExceptionHandler(Exception.class)
publib List<UserDetailsDTO> findUserbyID(String id, String passwd)
{
List<UserDetailsDTO> user=new ArrayList<UserDetailsDTO>();
List<Object[]> repouser=repo.findUserbyID(id,passwd);
UserDetailsDTO udto=new UserDetailsDTO();
for(Object[] ob:repouser)
{
udto.setid((String)ob[0]));
udto.setname((String)ob[1]));
udto.setunit((String)ob[2]));
user.add(udto);
}
return user;
}
*********UserDetailsDTO ********
public class UserDetailsDTO implements Serializable{
private String id,name,unit,passwd;
public String setid(String id)
{this.id=id;}
public String setpasswd(String passwd)
{this.passwd=passwd;}
public String setname(String name)
{this.name=name;}
public String setunit(String unit)
{this.unit=unit;}
public String getid()
{return id;}
public String getname()
{return name;}
public String getunit()
{return unit;}
public String getpasswd()
{return passwd;}
}
*********UserDetailsService********
public class UserDetailsService{
@Autowired
private UserHelper helper;
public List<UserDetailsDTO> getUser(@PathVariable("id") String id, @PathVariable("passwd") String passwd)
{
List<UserDetailsDTO> udto=new ArrayList<UserDetailsDTO>();
udto=helper.findUserbyID(id,passwd);
if(udto==null)
throw new UserNotFound(id);
return udto;
}
}
************Test class**********
Importing junit and mockito related packages;
@RunWith(MockitoJUnitRunner.class)
public class UserDetailsTest{
@InjectMocks
UserDetailsService service;
@Mock
IUserDetails rep;
@Before
public void setUp()
{
MockitoAnnotations.initMocks(this);
}
@Test
public void TestFindUser()
{
UserDetailsDTO details=new UserDetailsDTO();
detail.setid("123");
details.setpasswd("p@wd");
details.sename("MyName");
details.setunit("Engg");
Mockito.when(rep.findUserbyId("123","p@wd")).thenReturn(details);
// Throws me error related to mismatch return types
//when i change it to thenReturn((List<Object[]>)details), it throws error that it is not able to stub
List<UserDetailsDTO> ud=serrvice.getUser("123","p@wd");
asserThat(ud,is(notNullValue()));
assertEquals(ud,details);
}
}
答案 0 :(得分:1)
从UserDetailsService
角度来看,您不需要模仿IUserDetails
,而是UserHelper
:
public class UserDetailsTest{
@InjectMocks
UserDetailsService service;
@Mock
UserHelper helperMock;
@Before
public void setUp()
{
MockitoAnnotations.initMocks(this);
}
@Test
public void TestFindUser()
{
UserDetailsDTO details=new UserDetailsDTO();
detail.setid("123");
details.setpasswd("p@wd");
details.sename("MyName");
details.setunit("Engg");
List<UserDetailsDTO> userList = new ArrayList<>();
userList.add(details);
Mockito.when(helperMock.findUserbyID("123","p@wd")).thenReturn(userList);
List<UserDetailsDTO> resultUserList=serrvice.getUser("123","p@wd");
asserThat(ud,is(notNullValue()));
assertThat("Size", userList.size(), equalTo(resultUserList.size());
assertEquals("Details",details, equalTo(resultUserList.get(0)));
}
您尝试实现的方案将在UserHelper
测试类中占有一席之地:
public class UserHelperTest{
@InjectMocks
UserHelper userHelper;
@Mock
IUSerDetails repo;
@Before
public void setUp()
{
MockitoAnnotations.initMocks(this);
}
@Test
public void shouldFindUserById()
{
String id = "id";
String name = "name";
String unit = "unit";
String passwd = ""passwd";
List<Object[]> queryResult = new ArrayList<>();
queryResult.add(new Object[]{id,name,unit});
Mockito.when(repo.findUserByID(id,passwd)).thenReturn(queryResult));
List<UserDetailsDTO> resultList = userHelper.findUserbyID(id,passwd);
// assertions on size and content of first element..