Junit框架单元测试:模拟void方法时,Mockito.doNothing()没有按预期工作

时间:2018-02-19 18:24:33

标签: java unit-testing mockito void

我正面临一个问题,在" 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());
   }
}

3 个答案:

答案 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());
  }
}