我有内部类的课程,如下所示:
public class ClassWithInnerObject {
private final InnerObject innerObject;
public ClassWithInnerObject() {
innerObject = new InnerObject();
}
public void callInnerObjectMethod() {
innerObject.outerFunc();
}
public void outerFunc() {
innerFunc();
}
public void innerFunc() {
Log.d("XXX", "innerFunc: called");
}
public class InnerObject {
public void outerFunc() {
innerFunc();
}
}
}
模仿测试如下所示:build.gradle:
androidTestCompile 'junit:junit:4.12'
androidTestCompile 'org.mockito:mockito-core:1.10.19'
androidTestCompile 'com.crittercism.dexmaker:dexmaker:1.4'
androidTestCompile 'com.crittercism.dexmaker:dexmaker-mockito:1.4'
androidTestCompile 'com.crittercism.dexmaker:dexmaker-dx:1.4'
测试:
@RunWith(AndroidJUnit4.class) public class SpyVerifyTest {
@Test public void myInnerTestWorking() {
ClassWithInnerObject p = new ClassWithInnerObject();
ClassWithInnerObject spy = Mockito.spy(p);
spy.outerFunc();
verify(spy, times(1)).innerFunc();
}
@Test public void myInnerTestNotWorking() {
ClassWithInnerObject p = new ClassWithInnerObject();
ClassWithInnerObject spy = Mockito.spy(p);
spy.callInnerObjectMethod();
verify(spy, times(1)).innerFunc();
}
}
第一次测试正在按预期方式工作。第二个innerFunc
永远不会被检测为“已调用”,尽管在日志中我看到的是。有什么问题吗?:)
谢谢!
怎么了?
好吧,这里的问题非常微妙,当您调用时Mockito.spy(p)
,mockito
会在实例背后创建某种装饰器,以ClassWithInnerObject
允许监视实例上的所有方法调用。因此,您可以检查给定方法被调用了多少次,
但是在装饰器 上 却 没有在您的实例上进行。在这里,当您使用内部类时,它会在装饰器上调用not
innerFunc()
的实例,ClassWithInnerObject
因此Mockito
innerFunc()
尚未被调用 。
我正在为类编写一个单元测试,该类如下所示: 我想编写一个简单的单元测试,它将方法存根(这样它就不会实际触发并命中数据库),但它允许我验证调用是否最终执行。Mockito似乎是这份工作的合适工具。 这似乎是一个很好的游戏计划(至少对我来说)。但当我实际编写代码时,在测试方法的第2行(行)出现以下编译器错误: 类型Mockito中的(T)不适用于参数(void)时的方法 我看到Mockito无法模拟返
当我试图在单元测试中窥探一个对象时,我得到了一个异常。这是我的单元测试文件: 我在assign bookInfoParams Spy链接处遇到异常:
引用同一类中的模拟方法 测试类 当调用真正的类temp到methodA时,应该返回模拟的方法B的值。从而返回true。为什么这不正确。我遇到了同样的问题。我想在真实的类上运行测试,而不是像答案中建议的那样在模拟对象上运行测试。我想运行类methodA,并在调用它时期待模拟对象spyTemp methodB的值
我正在为一个具有2级依赖注入的类编写一个测试用例。我对1级依赖项注入对象使用@Spy注释,我想模拟第2级注入。但是,我在第二级上不断遇到空指针异常。有没有办法将模拟注入@Spy对象?
所以我有一个调用https请求的方法。我已经成功地在其他测试中中断了调用,但是这个测试打败了我,因为它根本不起作用。 在我的beforeach中,我创建存根,在我的afterEach中,我执行存根还原 在测试中,我创建了四个存根调用。
问题内容: 我有以下控制器 ViewMeetingCtrl.js 我能够成功地为 cancelMeeting() 调用spyOn,但不能通过 sendCancelNotices 方法的调用来 实现 。我想要做的是,我想测试,只要 cancelMeeting() 被调用,它调用 sendCancelNotices() 方法。我知道我应该使用createSpy方法来执行此操作。但是我不确定该怎么做。