java - 在单元测试中使用模拟实现修补 Java 类

标签 java unit-testing mocking

我有一个类 A,它在内部实例化类 B 的一个对象。第二类有很多外部副作用,例如它使用网络连接。

public class A {
  private B b;
  public A() {
    b = new B(); // 3rd party class that calls out externally (e.g. to a db)
  }
}

我想通过提供类 B 的模拟实现来对类 A 进行单元测试。我可以通过编写自己的类或使用 Mockito 和其他框架之类的东西轻松创建 B 的模拟版本,但是我如何注入(inject)这个模拟实现到 A 类的代码中?

我想我可以在类 A 的构造函数中请求类 B 的实例,但这看起来很难看。没有人真的需要知道 A 类公司是如何开展业务的。

Python 有一个“模拟”库,允许您在测试期间在运行时“修补”函数。 Java 有类似的东西吗?

最佳答案

在这种情况下,我通常有一个第二个包(默认)作用域构造函数,它允许您传递模拟以进行测试。

public class A {
  private B b;

  /*
  *  Used by clients
  */
  public A() {
    this(new B());
  }

  /*
  * Used by unit test
  * 
  * @param b A mock implementation of B
  */
  A(B b) {
    this.b = b;
  }
}

关于java - 在单元测试中使用模拟实现修补 Java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12665049/

相关文章:

unit-testing - 当A的方法在Go中返回B时模拟对象A和B

javascript - proxyquire 如何处理代理模块的二级(间接)需求?

java - 如何使用 equals 方法将对象添加到数组列表中以排除相似的对象?

javascript - angularjs 单元测试 Controller orderBy

java - 原始数据类型引用

javascript - Typescript + Jasmine/Mocha,但没有全局类型?

node.js - 使用请求负载模拟 HTTP 请求和响应

android - DaggerMock 正在生成意外实例

java - 我的java程序时不时地卡住并且可能存在内存泄漏。我的遥测有用吗?

java - 用于 Vaadin 应用程序的 MVC 骨架?