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

标签 java unit-testing mockito void

我面临一个问题,“Mockito.doNothing()”似乎没有按预期模拟该方法。 在下面的代码(伪代码)中,“执行 functionC”返回异常。 我试图通过模拟 classB 及其方法来测试 FunctionA。 考虑到 functionB 已被模拟为立即返回到调用者(而不执行 functionC ),我预计 Mockito.verify 会成功。 但是 testFunctionA() 遇到异常(由 functionC 抛出),请记住 functionC 不应该被执行(由于使用 Mockito.doNothing() 模拟了 functionB )。

如果我遗漏了什么,您能告诉我吗?任何其他模拟 void 方法(立即返回)的替代方法将受到高度赞赏。

谢谢, 瓦姆西。

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 的实例中注入(inject)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);

关于java - Junit 框架单元测试 : Mockito. doNothing() 在模拟 void 方法时无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48872085/

相关文章:

java - 从命令行运行时测试 FileNotFoundException

swift - 如何在结构/类中 stub Swift "Trait/Mixin"方法进行测试

java - 测试驱动开发 - 如何在不存在任何实现代码之前编写测试

java - mockito 是否应该调用模拟类的默认构造函数?

java - stub() 和 when() 有什么区别?

Java:最终局部变量无法分配,因为它是在封闭类型中定义的

java - 将 LinkedList 转换为 ArrayList 以加快并发迭代

java - 条码扫描仪 (ZXing) 崩溃

.net - 如何暂时禁用性能测试的 log4net 日志记录?

java - 单元测试时出现 "XmlPullParserFactory not mocked"问题