模拟接口存储库

时间:2017-02-25 02:19:17

标签: java unit-testing junit mocking mockito

我应该模仿别人写的存储库。

我有一个接口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);
}
}

1 个答案:

答案 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..
相关问题