mockito 如何在Spring Boot Service的单元测试中验证具有事务行的方法?

4ioopgfo  于 2022-11-08  发布在  Spring
关注(0)|答案(1)|浏览(164)

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是否足够?

  • 谢谢-谢谢
wqsoz72f

wqsoz72f1#

由于userRepository是一个mock,您可能为findByUsername调用定义了一个行为,并在那里返回一个对象。该对象是在test方法中创建的(在“given”块中),因此在调用该方法后(在“then”块中),您可以访问它。您可以简单地验证该对象是否包含一个给定的角色,如下所示(假设为AssertJ ussage):

assertThat(user.getRoles())
   .contains(role);

roleRepository也是一个mock,所以role对象可能在测试中也是可用的。如果不是这样的话,可以从Assert的对象中提取角色的信息并进行验证(例如一个String形式的名称)。

相关问题