Java Junit框架单元测试:Mockito.doNothing()不';模拟void方法时无法按预期工作
我面临一个问题,在“Mockito.doNothing()”中,似乎没有像预期的那样模拟该方法。 在下面的代码(伪代码)中,“函数C的执行”返回一个异常。 我试图通过模仿classB及其方法来测试FunctionA。 考虑到functionB已被模拟立即返回调用方(不执行functionC),我原以为Mockito.verify会成功。 但是testFunctionA()遇到异常(由functionC引发),记住functionC不应该被执行(因为使用Mockito.doNothing()模拟functionB) 如果我遗漏了什么,你能告诉我吗?任何其他替代模拟无效方法的方法(立即返回)将不胜感激 谢谢, 瓦姆西Java Junit框架单元测试:Mockito.doNothing()不';模拟void方法时无法按预期工作,java,unit-testing,mockito,void,Java,Unit Testing,Mockito,Void,我面临一个问题,在“Mockito.doNothing()”中,似乎没有像预期的那样模拟该方法。 在下面的代码(伪代码)中,“函数C的执行”返回一个异常。 我试图通过模仿classB及其方法来测试FunctionA。 考虑到functionB已被模拟立即返回调用方(不执行functionC),我原以为Mockito.verify会成功。 但是testFunctionA()遇到异常(由functionC引发),记住functionC不应该被执行(因为使用Mockito.doNothing()模拟f
您从未将
classB
mock注入被测类classA
的实例中。因此,当您操纵被测对象时,记录的行为将无效:
private classA objectA = new classA();
您可以在ClassA
的构造函数或function()方法中传递ObjectB
例如,要使用该方法执行此操作,请执行以下操作:
public void functionA(ClassB classB) {
int localA;
String localB;
classB.functionB(localA, localB);
}
在你的测试中:
objectA.functionA(objectB);
这里的问题是,您从未将classB
的模拟传递给classA
的测试对象。还请参考classA
在每个函数调用上创建B
的新实例(我想这应该是classB
)。因此,它永远不会使用classB
mock
我建议将classB
作为classA
public class classA {
classB b = new classB();
public void functionA() {
int localA = 1;
String localB = "";
b.functionB(localA, localB);
}
}
并使用injectmock
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());
}
}
为什么您认为functionC不会执行?你不是在嘲笑它。。。
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());
}
}