【问题标题】:Method equivalent for @InjectMocks@InjectMocks 的等效方法
【发布时间】:2012-10-12 07:35:41
【问题描述】:

什么是等效的方法:

@Mock
MyType1 myType1;

@Autowired
@InjectMocks
MyType2 myType2;

我可以用mock(MyType1.class) 替换@Mock

但是如何用方法调用替换@InjectMocks?像这样的:

injectMocks(MyType2.class)

【问题讨论】:

    标签: java junit mocking mockito


    【解决方案1】:

    Mockito 中没有用于模拟注入的公共 API。另外,由于此注释主要是根据测试中的布局方式驱动的,因此它与测试的初始化阶段相当相关。

    虽然它可能会在未来的某个时候改变。

    但是,Mockito 注释字段可以由 MockitoJUnitRunnerMockitoAnnotations.initMocks() 初始化。它们都创建模拟实例并执行注入。

    我还在您的代码中看到您正在使用@Autowired - 因此是spring 的东西,可能是通过XML 配置的。 @InjectMocks 并不是真正为与其他依赖注入框架一起工作而开发的,因为开发是由单元测试用例驱动的,而不是集成测试。

    您可能想看看springockito,这是另一个试图在 Spring 中简化 Mockito 模拟创建的项目。

    希望有帮助

    【讨论】:

    • 链接已失效。
    • @TarunMaganti 我更新了链接。虽然现在好像有几个 springockito 的叉子,但我认为这是官方的,但在使用前请检查 ;)
    【解决方案2】:

    为什么在你的 junit 测试中使用Autowired?由于您正在模拟 MyType2 的依赖项,因此您必须在编写测试时知道它的 concreate 实现。

    那么你不需要也不应该使用 Spring 或任何注入框架来创建你想要测试的 MyType2 的实例。直接在您的测试初始化​​中创建它!我知道在使用 IoC 框架几年之后,编写 myType2 = new MyType2Impl(mock(myType1.class)) 很困难,但它确实会让您的测试更简单、更快(因为无需构建应用程序上下文)。 例如:

    @Before
    public void setup() {
      myType1 = mock(MyType1.class);
      myType2 = new MyType2Impl(myType1);
    }
    

    但是,如果您真的想在您的 junit 测试中使用 IoC,请使用 Brice 建议的 springockito,并在您的应用程序上下文中构建您的模拟 MyType1

    【讨论】:

    猜你喜欢
    • 2015-08-26
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2012-01-14
    • 2019-01-06
    相关资源
    最近更新 更多