这是一个非常初学者的问题:
我模拟的类有方法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)。
导致这种情况的原因是什么?
提前谢谢你,
由里。
答案 0 :(得分:0)
如果我理解正确,你有一个你正在嘲笑的课程ClassA
,它有两种方法,method1
和method2
。而且您知道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