在我们的Java代码库中,我不断看到以下模式:
/**
This is a stateless utility class
that groups useful foo-related operations, often with side effects.
*/
public class FooUtil {
public int foo(...) {...}
public void bar(...) {...}
}
/**
This class does applied foo-related things.
*/
class FooSomething {
int DoBusinessWithFoo(FooUtil fooUtil, ...) {
if (fooUtil.foo(...)) fooUtil.bar(...);
}
}
困扰我的是FooUtil,由于测试,我必须传递一个无处不在的实例。
- 我无法将
FooUtil方法设为静态,因为我无法模拟它们来测试FooUtil其客户端类和客户端类。 - 同样,我无法
FooUtil在消费地点创建的实例new,因为我将无法对其进行模拟以进行测试。
我想我最好的选择是使用注射(我也这样做),但这会增加自己的麻烦。同样,传递几个util实例会扩大方法参数列表的大小。
有没有办法更好地处理我看不到的问题?
更新:由于实用程序类是无状态的,因此我可以添加一个静态单例INSTANCE成员或一个静态getInstance()方法,同时保留更新该类的基础静态字段以进行测试的能力。看起来也不是超级干净。
FooUtil应该将方法放进去FooSomething,也许FooSomething应该更改/扩展其属性,以便FooUtil不再需要这些方法。请给我们一个更具体的例子,FooSomething以帮助我们为这个问题提供一个很好的答案。