3

我有一个 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 的模拟版本,但是如何将这个模拟实现注入到类中A的密码?

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

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

4

3 回答 3

3

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

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;
  }
}
于 2012-09-30T21:02:21.063 回答
0

查看Mockito。 最终,根据您的设计,您需要使用反射将 B 的模拟实例放入 A。

于 2012-09-30T21:01:42.847 回答
0

使用 JMockit 模拟 API 解决这个问题很简单:

public class ATest
{
    @Test
    public void myTest(@Mocked B mockB)
    {
        // Record expectations on "mockB", if needed.

        new A().doSomethingUsingB();

        // Verify expectations on "mockB", if applicable.
    }
}
于 2013-04-26T17:58:49.937 回答