Java Mockito非存根函数

Java Mockito非存根函数,java,android,mocking,mockito,Java,Android,Mocking,Mockito,我刚刚开始使用Mockito,所以对它不是很熟悉。我模仿过这样一个物体: CInjectorFactory mockFactory = mock(CInjectorFactory.class); 现在,如果我不存根一个特定的函数,它就不会调用原始CInjectorFactory的函数,我会得到一个“null”值: public CMainActivityHelper getMainActivityHelper() 这是否意味着只有存根函数可用于模拟对象?这个被模拟的对象不会从被模拟的对象继承

我刚刚开始使用Mockito,所以对它不是很熟悉。我模仿过这样一个物体:

CInjectorFactory mockFactory = mock(CInjectorFactory.class);
现在,如果我不存根一个特定的函数,它就不会调用原始CInjectorFactory的函数,我会得到一个“null”值:

public CMainActivityHelper getMainActivityHelper()
这是否意味着只有存根函数可用于模拟对象?这个被模拟的对象不会从被模拟的对象继承原始函数吗

谢谢。

是的,就是这样:

默认情况下,对于所有返回值的方法,mock返回null、空集合或适当的基元/基元包装值(例如:0、false、…表示int/Integer、boolean/boolean、…)

如果希望在不存根时调用实际方法,则应:

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

是的,就是这样:

默认情况下,对于所有返回值的方法,mock返回null、空集合或适当的基元/基元包装值(例如:0、false、…表示int/Integer、boolean/boolean、…)

如果希望在不存根时调用实际方法,则应:

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


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

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

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

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

CMainActivityHelper expected = ...;
when(mockFactory.getMainActivityHelper()).thenReturn( expected );
然后,当您调用
mockFactory.getMainActivityHelper()
时,它将返回
预期值

,您可以使用:

CInjectorFactory mockFactory = mock(CInjectorFactory.class, Mockito.CALLS_REAL_METHODS);
然后,未建模的方法将委托给实际实现

来自
Mockito.CALLS\u REAL\u方法的示例

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();
您可以使用:

CInjectorFactory mockFactory = mock(CInjectorFactory.class, Mockito.CALLS_REAL_METHODS);
然后,未建模的方法将委托给实际实现

来自
Mockito.CALLS\u REAL\u方法的示例

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();

这对我很有效,但我更喜欢模拟,而不必创建spy所需的对象实例。谢谢。这对我很有用,但我更喜欢模拟,而不必创建spy所需的对象实例。谢谢。@rajath:请注意,使用
调用\u REAL\u方法
的模拟对象可能有点危险,如果它们使用任何字段或其他实例状态——对象将不会调用其构造函数,也不会发生隐式内联字段初始化。使用spies,您可以实际构造和初始化对象。调用\u REAL\u方法仍然很方便,但是,如果您的方法不需要状态,或者如果它完全按照您模拟的方法运行。@rajath:请注意,使用
调用\u REAL\u方法的模拟对象可能有点危险,如果它们使用任何字段或其他实例状态,对象将不会调用其构造函数,隐式内联字段初始化也不会发生。使用spies,您可以实际构造和初始化对象。但是,如果您的方法不需要状态,或者如果它完全按照您模拟的方法运行,那么调用\u REAL\u方法仍然很方便。