i具有以下UserServiceImpl服务类:
@Service @Transactional
public class UserServiceImpl implements UserDetailsService {
...
public void addRoleToUser(String username, String name) {
User user = this.userRepository.findByUsername(username);
Role role = this.roleRepository.findByName(name);
user.getRoles().add(role);
}
}
和它对应的测试类:
public class UserServiceImplTest {
@Mock private UserRepository userRepository;
@Mock private RoleRepository roleRepository;
private AutoCloseable autoCloseable;
private UserServiceImpl userServiceImpl;
@BeforeEach
void setUp(){
autoCloseable = MockitoAnnotations.openMocks(this);
userServiceImpl = new UserServiceImpl(userRepository, roleRepository);
}
@AfterEach
void tearDown() throws Exception{
autoCloseable.close();
}
@Test
void testAddRoleToUser() {
... // user and role def. here
userServiceImpl.addRoleToUser(username, roleName);
// what should be here?
}
}
但是我如何验证user.getRoles().add(role);
在单元测试中被调用呢?使用mockito和ArgumentCaptor是否足够?
- 谢谢-谢谢
1条答案
按热度按时间wqsoz72f1#
由于
userRepository
是一个mock,您可能为findByUsername
调用定义了一个行为,并在那里返回一个对象。该对象是在test方法中创建的(在“given”块中),因此在调用该方法后(在“then”块中),您可以访问它。您可以简单地验证该对象是否包含一个给定的角色,如下所示(假设为AssertJ ussage):roleRepository
也是一个mock,所以role
对象可能在测试中也是可用的。如果不是这样的话,可以从Assert的对象中提取角色的信息并进行验证(例如一个String形式的名称)。