有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何模拟方法调用而不实际调用其子方法

我从昨天开始使用JUnits(Mockito)。我搜索了类似的问题,但没有找到

我有一个方法为method1()的类,该方法反过来调用method2()

我不想嘲笑method2

我正在模拟对method1()的调用。我希望它会返回我想要的自定义对象(不需要继续调用method2)。但是它继续并尝试调用method2()

class A {
    method1() {
    //do something.
    method2();
    }
}

我模仿method1并返回任何对象(比如^{

我不想别人打电话给我。但是当我调试这个Junit时。它去调用method2。因此失败了


共 (2) 个答案

  1. # 1 楼答案

    当使用这样的语法时:

    @Test public void yourTest() {
      A mockA = Mockito.mock(A.class, Mockito.CALLS_REAL_METHODS);
      when(mockA.method1()).thenReturn(Integer.valueOf(1));
    }
    

    然后,Java将要做的第一件事是计算when(mockA.method1()),这需要调用mockA.method1()来获得要传递到when的值。对于其他mock,您不会注意到这一点,因为Mockito mock返回很好的默认值,但是对于spies和CALLS_REAL_METHODSmock,这是一个更大的问题。显然,这种语法不起作用

    相反,请使用以do开头的方法:

    @Test public void yourTest() {
      A mockA = Mockito.mock(A.class, Mockito.CALLS_REAL_METHODS);
      doReturn(Integer.valueOf(1)).when(mockA).method1();
    }
    

    作为.when(mockA)的一部分,Mockito将返回一个没有行为的实例,因此对method1()的调用永远不会在真实实例上发生do语法也适用于void方法,这使得它比when(...).thenReturn(...)语法更灵活。一些开发者主张一直使用doReturn;我更喜欢thenReturn,因为它更容易阅读,还可以为您进行返回类型检查


    顺便说一句,除非你绝对需要一个全新的实例,否则最好选择Integer.valueOf(1)而不是new Integer(1)。Java保留了一个小整数的缓存,如果需要手动将int放入Integer中,这可能比分配一个全新的引用更快