测试void方法的行为

Gam*_*ogo 8 java junit unit-testing mockito

假设我有以下服务对象

public class UserService {

    @Autowired
    private UserDao dao;

    public void addUser(String username, String password) {
        if (username.length() < 8 ) {
            username = username  + "random" ; // add some random string
        }
        User user = new User(username, password);

        dao.save(user);
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望在用户名长度小于8且用户名大于8个字符时测试方法"addUser"的行为.如何在单元测试UserService.addUser(...)中进行验证并验证它?我知道使用assert(),但值"password"在addUser(...)方法之外是不可用的.

我使用JUnit和Mockito.

Gam*_*ogo 7

在几个月后再次重新访问问题后,我提出了一个解决方案.

我们的想法是观察传递给UserDao的对象用户.我们可以通过执行此操作来检查用户名的值,因此单元测试代码:

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
    @Mock
    private UserDao dao;

    @InjectMock
    private UserService service;

    @Test
    public void testAddingUserWithLessThan8CharUsername () {
        final String username = "some";
        final String password = "user";
        doAnswer(new Answer<Object>() {
            @Override
            public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
                Object[] args = invocationOnMock.getArguments();
                User toBeSaved = (User) args[0];
                Assert.assertEquals(username + "random", toBeSaved.getPassword());
                return null;
            }
        }).when(userDao).save(Matchers.any(User.class));
        service.addUser(username, password);
    }
}
Run Code Online (Sandbox Code Playgroud)

Guillaume实际上有最接近的答案,但他回答使用jMock.但是,他给了我关于如何实现这个目标的想法,所以我认为他也应该得到一些荣誉.