在我们的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
以帮助我们为这个问题提供一个很好的答案。