クラスで静的メソッドをモックする方法の例をたくさん見ました。
定義で初期化されているクラスの静的プロパティをモックしたい。
何かのようなもの:
class MyClass {
private static log = LogFactory.getLog(this)
}
テストで null にする必要があり、それ自体を初期化しないようにするために、ログ プロパティをモックしたいと考えています。
クラスで静的メソッドをモックする方法の例をたくさん見ました。
定義で初期化されているクラスの静的プロパティをモックしたい。
何かのようなもの:
class MyClass {
private static log = LogFactory.getLog(this)
}
テストで null にする必要があり、それ自体を初期化しないようにするために、ログ プロパティをモックしたいと考えています。
「ログ」をプロパティと呼んでいますが、実際にはそうではありません。MyClass が Groovy クラスであると仮定すると、プロパティは次のように private または public 修飾子なしで宣言されます。
class MyClass {
static log = LogFactory.getLog(this)
}
あなたが持っているのは、初期化子を持つプライベート静的変数です。この場合、プロパティ アクセス メソッドは生成されず、変数はプロパティとは見なされません。
これは初期化子を持つプライベート変数であり、クラスを変更したくないと述べているため、初期化子の実行を停止することはできません。したがって、ここで行う最善の方法は、getLog() 呼び出しをモックアウトして null を返すことです。シンプルだが大雑把なアプローチは次のとおりです。
LogFactory.metaClass.static.getLog = {
return null
}
ただし、これにより、アプリケーション全体のすべてのログ ルックアップが強制終了されます。これは単純な単体テストには問題ありませんが、より具体的な解決策は、Groovy モック (MockFor および StubFor) を使用することです。これにより、特定のコード ブロックで getLog 呼び出しをモックできます。詳細はこちら
興味深いことに、ログ変数を初期化しないのはなぜですか?