【发布时间】:2021-11-19 13:34:39
【问题描述】:
我有一个名为UserServiceImpl 的@Service,它依赖于另外两个bean。一个是 UserRepository bean,另一个是名为 SessionService 的 bean。
我的要求是在 UserServiceImpl 类的测试期间,我必须能够注入 SessionService 依赖项的模拟,但保持 UserRepository 依赖项原样。
我的服务类如下所示:
@Service
@Slf4j
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private SessionService sessionService;
@Override
public User create(User user) {
log.info("User Creation at Service");
// ... Do some validations .. //
// This needs to be mocked in Unit Tests
String returnValue = sessionService.doSomethingThatIDontWantInTests();
user.setInternalKey(returnValue);
// .. Do some more Validations .. //
return userRepository.save(user);
}
}
现在,这是我的测试课:
@SpringBootTest
class UserServiceTest {
@InjectMocks
private UserServiceImpl userService;
@Mock
private SessionService sessionService;
@Test
void CreateUserTest() {
Mockito.when(sessionService.doSomethingThatIDontWantInTests()).thenReturn("abcxyz123321");
User user = new User();
user.setName("John Doe");
user.setEmail("john.doe@example.com");
User savedUser = userService.create(user);
assertNotNull(savedUser.getUserId());
}
}
当我运行这个测试时,Mockito 成功地模拟了 SessionService 调用。但是,UserServiceImpl.createUser() 仍然失败并显示以下消息:
java.lang.NullPointerException: Cannot invoke "com.myproject.data.repos.UserRepository.save(User)" because "this.userRepository" is null
我是否应该也注入 UserRepository 作为模拟并使用 Mockito 模拟 UserRepository.save() 方法?
我只想模拟 SessionService 依赖项,而不是 UserRepository 依赖项。
这是可行的吗?如果是这样,怎么做?请指教。
谢谢, 斯里拉姆
【问题讨论】:
标签: java spring-boot unit-testing mockito