Java 将bean注入到用mockito创建的mock中

Java 将bean注入到用mockito创建的mock中,java,unit-testing,mockito,javabeans,code-injection,Java,Unit Testing,Mockito,Javabeans,Code Injection,目前,我在mockito库中遇到一些问题。。。更确切地说,我无法将userRepository bean注入到我的模拟服务中。对于依赖注入,我使用SpringBoot。以下是一些代码示例: @Service public class UserService { @Autowired private TokenService tokenService; @Autowired private UserRepository userRepository; public

目前,我在mockito库中遇到一些问题。。。更确切地说,我无法将userRepository bean注入到我的模拟服务中。对于依赖注入,我使用SpringBoot。以下是一些代码示例:

@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和@injectmock,但这些注释用于注入Mock。我怎样才能把一个真正的豆子注入到我的mock中呢?使用mockito可以吗?
谢谢。

Mockito的思想是模拟集成点,本质上是模拟您进行的任何第三方调用,以便您可以测试您的代码单元。比如,如果我与之交谈的其他一切都有效,那么我的代码也应该有效

考虑到这一点,我认为您不应该使用mockito将实体保存到数据库中。如果您需要在DB中持久化某些内容,请尝试编写集成测试,在这种情况下,您可以使用Spring配置来提供实际的bean


话虽如此,如果您真的需要这样做,您可以在Spring中使用
ReflectionTestUtils.setField
,或者在mockito中使用
Whitebox.setInternalState(userService,“userRepository”,userRepository)

当前您正在模拟一个服务,这意味着您正在用模拟对象替换整个实例,甚至田野。如果你对部分模拟感兴趣(因为你想在里面使用真正的bean),你应该阅读有关间谍活动的内容(@Spy获取真实对象,但允许进行部分模拟)

我不确定您想做什么,但我的建议是创建SpringBootTest(加载应用程序上下文并创建所有bean),监视UserService bean,并最终像您现在这样模拟服务的行为


我从未尝试过监视bean,但我发现了一些东西:

为什么要注入一个真正的bean?在我的测试中,我需要将它保存到数据库中,这就是为什么我需要userRepository bean。如何
不做任何事(userService)。validateUser(any())编译?在mockito版本1.9.5和2.0.2中,您只有一个
Stubber mockito::doNothing()
方法