Mockito - 从非存根方法调用存根方法

时间:2016-06-03 22:17:59

标签: mockito

这是一个非常初学者的问题:

我模拟的类有方法Map<String, Integer>methodA(String p1,String p2,String p3, SomeClass p4)MyClass methodB(String p1,String p2,String p3)

methodA在内部调用methodB:

Map<String, Integer> methodA(String p1, String p2, String p3, SomeClass p4){
    MyClass data = methodB(p1,p2,p3);
    .... do something
    ... return Map.  
}

我正在修改methodB。

 when(mockedTestClass.methodB(p1, p2, p3, null)).thenReturn(myData);

我对第四个参数使用null,因为SomeClass是一个抽象类。 当我直接用p1,p2 p3和null(p4)参数调用测试中的stubbed方法时,它返回正确的模拟数据(MyClass的一个实例)。

但是,如果我调用methodA,似乎没有调用methodB并且返回空Map(非null)。

导致这种情况的原因是什么?

提前谢谢你,

由里。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你有一个你正在嘲笑的课程ClassA,它有两种方法,method1method2。而且您知道ClassA.method1恰好在内部调用了method2。所以你只是嘲笑method2,并使method1保留了默认行为,对吗?

所以在这种情况下,两种方法实际上都是模拟的,你在类级而不是方法级别进行模拟。当你执行when时,你会说,“我希望这个方法在这种特定情况下返回这个确切的结果。如果你不使用when,那么该方法是一个空模拟返回null或者它返回的类型的空值。假设你没有指定你不关心它。

因此,在模拟类时,您应该看到method1实际上没有调用method2。这两种方法都是模拟的,只有直接调用method2才会返回when匹配器的结果。

此外,when用于确保在调用方法时返回特定结果。如果要验证某个方法是否实际使用特定参数调用,可以这样做:

verify(mockedClass).someMethod(p1, p2, p3, null); // <- or use matchers for the parameters