想模拟属于另一个类的依赖项



我想测试的是abc()方法从UserServiceImpl类。在该方法中,它调用xyz(),它属于UserDao依赖项。在UserDao类中,它依赖于UserRepository, xyz()方法使用它。那么,当我测试abc()方法时,我如何模拟UserRepository依赖关系呢?非常感谢你的帮助。

public class UserServiceImpl{
@Autowired
UserDao userDao;
public void abc(){
userDao.xyz("a");
}
}
public class UserDao{
@Autowired
UserRepository userRepository;
public void xyz(String a){
Optional<User> userOptional = userRepository.findByName("mike");
}
}

如果您想测试UserServiceImpl.abc(),那么模拟UserDao并定义UserDao.xyz()的返回值,我看到您有没有参数的void方法,但对于示例,将String作为参数并返回User

@ExtendWith(SpringExtension.class)
@SpringBootTest(classes={UserServiceImpl.class})
public class UserServiceImplTest{
@Autowired
UserServiceImpl userSvc;
@MockBean
UserDao userDao;

@Test
public void abcTest(){
//define User to return and the mock
User userToReturn = new User("Mike");
when(userDao.xyz("mike")).thenReturn(userToReturn);
User retUser=userSvc.abc("mike");
//do some assertion...
}
}

如果你想测试UserDao,那么在它自己的test类中进行测试。

如果你模拟UserDao,你不需要模拟UserRepository,因为只有真正的UserDao需要它。

如果你把@Autowired注释移到构造函数中,它将更容易注入到测试中。

public class UserServiceImpl{

private final UserDao userDao;
@Autowired
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
public void abc(){
userDao.xyz("a");
}
}

测试:

UserDao userDao = mock(UserDao.class);
UserServiceImpl subject = new UserServiceImpl(userDao);
subject.abc();
[...]