【发布时间】:2012-09-30 20:54:58
【问题描述】:
我有一个 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有类似的吗?
【问题讨论】:
-
根据我的经验,创建“模拟对象”的最简单方法是:1)创建一个具有相同类/文件名的新 .java 文件,2)复制/粘贴所有公共方法,3)添加“做某事”所需的最低限度,4)修改我的项目,以便构建将选择新的“模拟”类而不是“真实”类。恕我直言...
-
一个常见的解决方案是“依赖注入”。基本上这意味着你避免做“b = new B();”在您的构造函数中精确地保持“可测试性”。相反,您总是拥有从外部提供的所需对象。这意味着就
A而言,使用真实对象或模拟对象没有区别。
标签: java unit-testing mocking