【问题标题】:Does Mockito support @Any @Inject with CDI's Instance<> interface?Mockito 是否支持带有 CDI 的 Instance<> 接口的@Any @Inject?
【发布时间】:2016-08-11 12:11:23
【问题描述】:

我有一个包含以下代码的类:

@Inject
@Any
private Instance<SomeInterface> SomeInterfaces;

这使我可以遍历该接口的所有实现。 现在,我想对此进行测试,因此我声明了这些接口中的一些@Mock,并希望将它们@InjectMocks 放入我的测试单元中。但这失败了。

是否可以很好地做类似的事情,或者我必须为Instance&lt;SomeInterface&gt;创建一个@Mock

【问题讨论】:

  • 好点,修改了标题
  • 我看到的唯一选择是在单元测试中使用完整的 CDI 并设置 CDI 上下文 - 这使得使用模拟实现变得更加困难,我真的不会在单元测试中去那里.因此,沿着模拟Instance 的路线,@Spy 示例显示here 可能是您最好的选择,因此您可以强制执行自己的实现。
  • 没有。一点也不。但好消息是,您只需启动 CDI 容器,例如,使用 Arquillian 和 Mock,您可以使用 mockito 实现并添加到部署中。
  • @KoosGadellaa 从 CDI 的角度来看,模拟 bean 的方法是使用 @Alternative。这样,您就可以使用具有相同上下文和所有内容的成熟 CDI 容器。只有您选择的 bean 会被您的替代实现(例如模拟)替换。如果您愿意,我可以详细说明。

标签: java mockito cdi


【解决方案1】:

Mockito 可以完成单元测试的全部工作。在这里,您想测试您的代码如何与 CDI 上下文集成 => 您需要一个您使用的 CDI 上下文的实例。当然,您可以要求 Mockito 注入一些模拟,但这样您将测试 Mockito 内部注入系统,而不是您的 CDI 上下文。 Mockito 警告你:

Mockito 不是依赖注入框架,不要指望这个速记实用程序注入复杂的对象图,无论是模拟/间谍还是真实对象。

【讨论】:

  • 以下更多是一种观点,因此不是答案的一部分:这就是我更喜欢 Spring 而不是 Java EE CDI 上下文的原因之一:前者现在配备了所有工具来轻松构建集成测试使用真正的 Spring 应用程序上下文
  • 谢尔盖好找! (是的,到目前为止我同意,但过去 5 年我一直在编程 spring,现在是时候看看对方是什么样子了;))
猜你喜欢
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
相关资源
最近更新 更多