【问题标题】:Inject beans into mocks created with mockito将 bean 注入使用 mockito 创建的模拟中
【发布时间】:2018-11-01 13:43:29
【问题描述】:

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

【问题讨论】:

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

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


【解决方案1】:

目前您正在模拟服务,这意味着您正在用模拟对象替换整个实例,甚至是字段。如果你对部分模拟感兴趣(因为你想在里面使用真正的 bean),你应该阅读spying(@Spy 接受一个真实的对象,但允许进行部分模拟)。

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

我从未尝试过窥探 bean,但我发现了一些东西:https://shekhargulati.com/2017/07/20/using-spring-boot-spybean/

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多