我正面临一个问题,在" operito.donothing(("中,似乎并没有按预期模拟该方法。在以下代码(伪代码(中,"函数执行"返回异常。我正在尝试通过嘲笑ClassB及其方法来测试功能。我曾期待Mockito.Verify考虑到该功能已被模拟了立即返回呼叫者(无执行函数(。但是testFunctiona((遇到了异常(由函数抛出(,请记住函数c执行(由于使用mockito.donothing((嘲笑函数b(((。
您能否让我知道我是否缺少某些东西?高度赞赏任何其他嘲笑空隙方法的替代方法(立即返回(。
谢谢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());
}
}
您永远不会在正在测试的类classA
的情况下注入classB
模拟。因此,当您操纵正在测试的对象时,记录的行为不会有效:
private classA objectA = new classA();
您可以在ClassA
的构造函数或functionA()
方法中传递ObjectB
。
例如,使用该方法来做到这一点:
public void functionA(ClassB classB) {
int localA;
String localB;
classB.functionB(localA, localB);
}
在您的测试中:
objectA.functionA(objectB);
这里的问题是,您永远不会将classB
模拟传递给正在测试的classA
的对象。请参考Mockito对象创建模拟指南
classA
在每个functionA
调用上创建了B
的新实例(我想这应该是classB
(。因此,它永远不会使用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());
}
}