当前位置: 首页 > 面试题库 >

Mockito间谍-在间谍对象中调用内部类方法而不是间谍方法时

田向荣
2023-03-14
问题内容

我有内部类的课程,如下所示:

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方法来执行此操作。但是我不确定该怎么做。