Java Junit框架单元测试:Mockito.doNothing()不';模拟void方法时无法按预期工作

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

我面临一个问题,在“Mockito.doNothing()”中,似乎没有像预期的那样模拟该方法。 在下面的代码(伪代码)中,“函数C的执行”返回一个异常。 我试图通过模仿classB及其方法来测试FunctionA。 考虑到functionB已被模拟立即返回调用方(不执行functionC),我原以为Mockito.verify会成功。 但是testFunctionA()遇到异常(由functionC引发),记住functionC不应该被执行(因为使用Mockito.doNothing()模拟functionB)

如果我遗漏了什么,你能告诉我吗?任何其他替代模拟无效方法的方法(立即返回)将不胜感激

谢谢, 瓦姆西


您从未将
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());
  }
}