在模拟对象时,使用间谍或什么时候?

时间:2013-10-25 14:06:27

标签: unit-testing mockito

我想测试一个方法,该方法获取一个信息作为参数的对象:

//mocking a user object with some random data
User user createMockUser(loginName, firstName, lastName, salutation, company, mailAddress);
//do something with that user object 
foo(user);

并且测试的重点是测试foo(用户)。

使用createMockUser()的这些变体:

使用何时功能:

protected User createMockUser(String loginName, String firstName, 
        String lastName, String salutation, String mailAddress) 
{
    User user = Mockito.mock(User.class);

    Mockito.when(user.getLoginName()).thenReturn(id);
    Mockito.when(user.getFirstName()).thenReturn(firstName);
    Mockito.when(user.getLastName()).thenReturn(lastName);
    Mockito.when(user.getSalutation()).thenReturn(salutation);
    Mockito.when(user.getMailAddress()).thenReturn(mailAddress);        
    return user;
}

使用间谍:

protected User createMockUser(String loginName, String firstName, 
        String lastName, String salutation, String mailAddress) 
{

    User spyUser = spy(new User());
    spyUser.setLoginName(loginName);
    spyUser.setFirstName(firstName); 
    spyUser.setLastName(lastName); 
    spyUser.setSalutation(salutation); 
    Mockito.when(spyUser.getMailAddress()).thenReturn(mailAddress); 

    return spyUser;
}

这根本不起作用:

protected User createMockUser(String loginName, String firstName, 
        String lastName, String salutation, String mailAddress) 
{
    User user;
    user = Mockito.mock(User.class);
    user.setLoginName(loginName);
    user.setFirstName(firstName);
    user.setLastName(lastName);
    user.setSalutation(salutation);
    Mockito.when(user.getMailAddress()).thenReturn(mailAddress);        
    return user;
}

我仍然是mockito的新手,但是从我得到的内容来看,spy确实使用了对象的方法来获取对象中的值,并且只是让get函数调用返回模拟中指示的内容。但是对于这个测试,它们的结果基本相同,因为我只想测试foo。 那么,哪一个更好还是更优雅?

1 个答案:

答案 0 :(得分:0)

模拟简单的豆通常不是很有趣。无论如何,如果调用getter,它都会返回使用setter方法设置的值。没什么大不了。

另一方面,如果你想检查多少次以及调用setter或getter的参数,那么对简单bean进行间谍是有意义的。因此,对于验证,间谍活动绝对可以,并且有意义。