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
この質問に対する適切な回答を提供するのに役立つもののより具体的な例を教えてください。