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



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

相关内容

  • 没有找到相关文章

最新更新