如何模拟调用集合方法且此集合没有 setter 的方法?

how to mock method which invoke collection method and this collection has not setter?

我关注class:

public class UsersHolder {
    private Set<User> users = new HashSet<>();

    public void addUser(User user) {
        users.add(user);
    }
    ...
}

用户没有setter方法

有没有办法测试addUser方法?

有办法。

@RunWith(MockitoJUnitRunner.class)
public class UsersHolderTest {
    @InjectMocks private UsersHolder usersHolder;
    @Mock private Set<User> users;

    @Test
    public void addUser_shouldAddUser() {
        // given
        User user = new User();
        // when
        usersHolder.addUser(user);
        // then
        Mockito.verify(usersHolder).add(user);
    }
}

也就是说我不会测试这么简单的逻辑。此外,在这种情况下,集合变成了应该来自外部的 class 依赖项(通常集合被视为在 class 内部管理的数据持有者)。