【问题标题】:Mockito non-stubbed functionsMockito 非存根函数
【发布时间】:2013-01-04 07:32:54
【问题描述】:

我刚开始使用 Mockito,所以不太熟悉它。我已经模拟了这样一个对象:

CInjectorFactory mockFactory = mock(CInjectorFactory.class);

现在,如果我不存根某个特定函数,它就不会调用原始 CInjectorFactory 的函数,我会得到一个“空”值:

public CMainActivityHelper getMainActivityHelper()

这是否意味着只有存根函数可用于模拟对象?这个模拟对象没有继承被模拟对象的原始函数?

谢谢。

【问题讨论】:

    标签: java android mocking mockito


    【解决方案1】:

    你可以使用:

    CInjectorFactory mockFactory = mock(CInjectorFactory.class, Mockito.CALLS_REAL_METHODS);
    

    然后,未存根的方法将委托给真正的实现。

    来自Mockito.CALLS_REAL_METHODS javadoc 的示例:

    Foo mock = mock(Foo.class, CALLS_REAL_METHODS);
    
     // this calls the real implementation of Foo.getSomething()
     value = mock.getSomething();
    
     when(mock.getSomething()).thenReturn(fakeValue);
    
     // now fakeValue is returned
     value = mock.getSomething();
    

    【讨论】:

    • @rajath:当心使用CALLS_REAL_METHODS 模拟对象可能有点危险,如果它们使用任何字段或其他实例状态 - 对象不会调用其构造函数,也不会隐式内联-字段初始化发生。使用间谍,您实际上可以构造和初始化对象。 CALLS_REAL_METHODS 仍然很方便,但是,如果您的方法不需要状态,或者它纯粹根据您模拟的方法运行。
    【解决方案2】:

    是的,那是documented behavior

    默认情况下,对于所有返回值的方法,mock 返回 null、空集合或适当的原始/原始包装器值(例如:0、false、...对于 int/Integer、boolean/Boolean、...) .

    如果你希望真正的方法在不被存根时被调用,你应该spy the real object

    您可以创建真实对象的间谍。当您使用间谍时,会调用真正的方法(除非方法被存根)。

    【讨论】:

    • 这对我有用,但我更喜欢模拟而不必创建对象的实例,这是间谍所需的。谢谢。
    【解决方案3】:

    mockito website 的首页清楚地显示了如何存根方法调用:

    CMainActivityHelper expected = ...;
    when(mockFactory.getMainActivityHelper()).thenReturn( expected );
    

    然后当您调用mockFactory.getMainActivityHelper() 时,它将返回expected

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 2011-09-06
      相关资源
      最近更新 更多