【问题标题】:How does Mockito spy mock internal method calls?Mockito spy 如何模拟内部方法调用?
【发布时间】:2015-04-13 13:15:40
【问题描述】:

我一直认为 Mockito 可以使用某种代理或类似的东西。但现在我发现,Mockito 允许我做类似的事情

class A {
  public String m1() {
    return m2();
  }

  public String m2() {
    return "Hello";
  }
}

class TestA {
  public testM1() {
    A a = Mockito.spy(A.class);
    when(a.m2()).thenReturn("Bye");
    Assert.assertEquals(a.m1(), "Bye");
  }
}

这不适用于代理。它是如何做到的? 可以使用该技术来允许调用内部 AOP 方法吗? (见Spring AOP not working for method call inside another method)

【问题讨论】:

    标签: java mockito


    【解决方案1】:

    Mockito 确实可以使用代理,并且支持间谍。不过,您的语法有点偏离:

    /* BAD */  A a = Mockito.spy(A.class);
    /* GOOD */ A a = Mockito.spy(new A());
    

    不同行为的原因是a 没有委派 到spy() 的参数,而是将字段值复制到一个全新生成的 A 子类,其中包含所有它的方法被覆盖。因此,在 Spring 中,在 A 中对 this 的引用是指未包装的实例,而在 Mockito 中,对 this 的引用是指已包装的对象——包括在 @987654328 内的 m2() 调用中对 this 的隐式引用@。

    虽然这听起来像是允许使用 AOP,但我无法测试它是否有效,并且相信这将取决于 Mockito 和 Spring AOP 的实现细节(以及包装的顺序)发生)。

    [社论:即使你可以让两个代码生成系统很好地协同工作,一年后你和你的同事还能阅读/理解/调试测试吗? :)]

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多