使用 ArgumentCaptor 验证参数

要验证在 mock 上调用的方法的参数,请使用 ArgumentCaptor 类。这将允许你将参数提取到测试方法中并对它们执行断言。

此示例测试一个更新具有给定 ID 的用户名的方法。该方法加载用户,使用给定值更新 name 属性并在之后保存。测试想要验证传递给 save 方法的参数是一个具有正确 ID 和名称的 User 对象。

// This is mocked in the test
interface UserDao {
    void save(User user);
}

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

    @Test
    public void testSetNameForUser() {
        UserService serviceUnderTest = new UserService(userDao);
        
        serviceUnderTest.setNameForUser(1L, "John");

        ArgumentCaptor<User> userArgumentCaptor = ArgumentCaptor.forClass(User.class);
        
        verify(userDao).save(userArgumentCaptor.capture());
        User savedUser = userArgumentCaptor.getValue();
        assertTrue(savedUser.getId() == 1);
        assertTrue(savedUser.getName().equals("John"));
    }
}