【发布时间】:2011-06-05 18:27:41
【问题描述】:
假设我有一个类 Foo,它只使用类 Bar 的实例进行实例化:
public Foo(Bar x) {
this.a = x.a();
this.b = x.b();
...
}
现在我想测试Foo,进一步假设难以创建具有所需状态的Bar 实例。作为附加约束,a, b, ... 字段被声明为 final,因此该字段的设置器不可用。
一种可能性是在 Foo 中创建一个额外的构造函数:
protected Foo(A a, B b, ...) {
this.a = a;
this.b = a;
...
}
此构造函数仅在测试期间使用,我将在此构造函数的注释中声明。
问题:这是代码异味吗?
我想到的另一个解决方案是嘲笑Bar。想知道在这种情况下这是否是最佳做法?
【问题讨论】:
-
如果你需要构造函数仅用于测试你正在测试错误的东西
-
@Op De Cirkel:你能说得更具体点吗?我想测试
Foo并想将其设置为特定状态......那么“错误的事情”是什么? -
Bar 是接口吗?在这些情况下,使用接口有助于放松耦合并简化测试。
-
@Hovercraft:不,它不是,但我可以改变它:) 如果它是一个接口,那么创建一个模拟实现它会很容易。但它也会引入一个新接口,当仅存在两个实现时,这可能会被视为开销。
标签: java unit-testing testing constructor