我正面临一个问题,在" Mockito.doNothing()"似乎没有像预期的那样模仿方法。 在下面的代码(伪代码)"执行functionC"返回异常。 我试图通过模拟classB及其方法来测试FunctionA。 考虑到functionB已被模拟立即返回调用者(不执行functionC),我原本以为Mockito.verify会成功。 但是testFunctionA()遇到异常(由functionC引发),记住functionC不应该被执行(由于使用Mockito.doNothing()模拟了functionB)。
如果我错过了什么,请你告诉我吗?任何其他模拟void方法的替代方法(立即返回)都将受到高度赞赏。
谢谢, Vamsi。
public class classA {
public void functionA() {
int localA;
String localB;
B b = new B();
b.functionB(localA, localB);
}
}
public class classB {
public void functionB(int a, String b) {
functionC(a, b);
}
}
public class testClassA {
private classA objectA = new classA();
@Mock
classB objectB;
@Test
public void testFunctionA() {
Mockito.doNothing().when(objectB).functionB(Mockito.anyInt(),Mockito.anyString());
objectA.functionA();
Mockito.verify(objectB, Mockito.times(1)).functionB(Mockito.anyInt(),Mockito.anyString());
}
}
答案 0 :(得分:2)
你永远不会在classB
的实例中注入classA
模拟,这是被测试的类。因此,当您操纵被测对象时,记录的行为将无效:
private classA objectA = new classA();
您可以在ObjectB
的构造函数或ClassA
方法中传递functionA()
。
例如,使用以下方法执行此操作:
public void functionA(ClassB classB) {
int localA;
String localB;
classB.functionB(localA, localB);
}
并在你的测试中:
objectA.functionA(objectB);
答案 1 :(得分:0)
这里的问题是你从未将classB
的模拟传递给classA
测试的对象。另请参阅Mockito Object Creation Mocking Guide
答案 2 :(得分:0)
classA
在每个B
调用中创建classB
的新实例(我想这应该是functionA
)。因此它永远不会使用classB
模拟。
我建议将classB
设为classA
public class classA {
classB b = new classB();
public void functionA() {
int localA = 1;
String localB = "";
b.functionB(localA, localB);
}
}
并使用InjectMocks
public class testClassA {
@InjectMocks
private classA objectA = new classA();
@Mock
classB objectB;
@BeforeMethod
public void init(){
MockitoAnnotations.initMocks(this);
}
@Test
public void testFunctionA() {
Mockito.doNothing().when(objectB).functionB(Mockito.anyInt(), Mockito.anyString());
objectA.functionA();
Mockito.verify(objectB, Mockito.times(1)).functionB(Mockito.anyInt(), Mockito.anyString());
}
}