这里有一个非常初学者的问题:
我模拟的类具有方法Map<String, Integer>methodA(String p1,String p2,String p3, SomeClass p4)
和MyClass methodB(String p1,String p2,String p3)
方法A内部调用方法B:
Map<String, Integer> methodA(String p1, String p2, String p3, SomeClass p4){
MyClass data = methodB(p1,p2,p3);
.... do something
... return Map.
}
我正在打乱方法B。
when(mockedTestClass.methodB(p1, p2, p3, null)).thenReturn(myData);
我使用null作为第四个参数,因为SomeClass是一个抽象类。当我在测试中使用p1、p2、p3和null(p4)参数直接调用stubed方法时,它会返回正确的mock数据(MyClass的实例)。
然而,如果我调用methodA,似乎没有调用methodB,并且返回空Map(非null)。
是什么原因造成的?
提前谢谢你,
尤里。
如果我理解正确的话,您有一个正在嘲笑的类ClassA
,它有两个方法,method1
和method2
。您知道ClassA.method1
恰好在内部调用method2
。所以您只嘲笑了method2
,并用默认行为留下了method1
,对吧?
所以在这种情况下,这两个方法实际上都是被嘲笑的,你是在类级别而不是方法级别上嘲笑。当你做when
时,你会说,"我希望这个方法在这个特定的情况下返回这个确切的结果。如果你不使用when
,那么这个方法就是一个空的mock,为它返回的类型返回一个null或空值。假设你不指定,你就不在乎。
因此,您应该看到,当类被嘲笑时,method1
实际上并没有调用method2
。这两种方法都是模拟的,只有对method2
的直接调用才会返回when
匹配器的结果。
此外,when
用于确保在调用方法时返回特定的结果。如果你想验证某个方法实际上是用特定的参数调用的,你可以这样做:
verify(mockedClass).someMethod(p1, p2, p3, null); // <- or use matchers for the parameters