将bean注入使用mockito创建的模拟中

时间:2018-05-22 17:41:54

标签: java unit-testing mockito javabeans code-injection

目前,我在使用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吗? 谢谢。

2 个答案:

答案 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。