目前,我在使用mockito库时遇到了一些问题...更确切地说,我无法将userRepository bean注入到我的模拟服务中。对于依赖注入,我使用的是Spring Boot。以下是一些代码示例:
@Service
public class UserService {
@Autowired private TokenService tokenService;
@Autowired private UserRepository userRepository;
public User updateUser(User user) {
validateUser(user); // can throw some validation errors
createToken(user); // creates token to my user
return userRepository.save(user);
}
}
在我的测试方法中,我想在用户更新之前跳过验证和令牌创建。
UserService userService = mock(UserService.class);
doNothing(userService).validateUser(any());
doNothing(userService).createToken(any());
因此,当我调用updateUser方法时,我的测试方法会出现问题,因为我的userRepository没有被注入(NullPointerException),所以它失败了。 我尝试使用@Mock和@InjectMocks,但这些注释用于注入模拟。如何将真实的bean注入我的模拟?这可能使用mockito吗? 谢谢。
答案 0 :(得分:1)
目前您正在模拟服务,这意味着您将使用模拟对象替换整个实例,甚至是字段。如果你对部分模拟感兴趣(因为你想在里面使用真正的bean),你应该阅读间谍(@Spy需要一个真实的对象,但允许进行部分模拟)。
我不确定你想做什么,但我的建议是创建SpringBootTest(它加载应用程序上下文并创建所有bean),监视UserService bean并最终模拟服务的行为,就像你现在正在做的那样。
我从未尝试过间谍豆,但我找到了一些东西:https://shekhargulati.com/2017/07/20/using-spring-boot-spybean/
答案 1 :(得分:0)
Mockito的想法是模拟集成点,基本上是你所做的任何第三方调用,以便你可以测试你的代码单元。有点像,如果我说的其他事情都有效,那么我的代码也应该有用。
考虑到这一点,我不认为你应该使用mockito将实体保存到数据库。如果你需要在数据库中保留一些东西尝试编写集成测试,那么在这种情况下你可以使用Spring配置提供实际的bean。
话虽如此,如果你真的需要这样做,你可以在Spring使用ReflectionTestUtils.setField
或在Whitebox.setInternalState(userService, "userRepository", userRepository)
使用mockito。