在测试过程中使用特殊构造函数是代码味道吗?

mts*_*tsz 5 java testing constructor unit-testing

假设我有一个Foo只用类实例实例化的类Bar:

public Foo(Bar x) {
    this.a = x.a();
    this.b = x.b();
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在我想测试Foo,进一步假设Bar难以创建具有所需状态的实例.作为附加约束,字段a, b, ...被声明为final,因此这些字段的setter不可用.

可能的方法是在Foo中创建一个额外的构造函数:

protected Foo(A a, B b, ...) {
    this.a = a;
    this.b = a;
    ...
}
Run Code Online (Sandbox Code Playgroud)

此构造函数仅在测试期间使用,我将在此构造函数的注释中声明.

问题:这是代码味吗?

我想到的另一个解决方案就是嘲笑Bar.想知道它是否是这种情况下的最佳做法?

Pet*_*rey 9

模拟棒更有可能被认为是最佳实践.你应该可以创建一个MockBar,这样你就可以做到

Foo foo = new Foo(new MockBar(a, b));
Run Code Online (Sandbox Code Playgroud)

  • 如果Bar接口很复杂,或者你想测试`a()`和`b()`是否按预期调用,我会用框架模拟它.对于一个简单的例子,我只想创建一个简单的Mock类. (2认同)