grails-framework では、いくつかのオブジェクトがログを使用しています。これは通常、grails によって注入されます。の実行で動作しgrails test-app
ます。しかし、同じテスト (統合テスト) は の実行時に失敗しますgrails test-app -integration
。
ここで何がうまくいかないのですか?どうにかしてログオブジェクトの注入を強制できますか?
grails-framework では、いくつかのオブジェクトがログを使用しています。これは通常、grails によって注入されます。の実行で動作しgrails test-app
ます。しかし、同じテスト (統合テスト) は の実行時に失敗しますgrails test-app -integration
。
ここで何がうまくいかないのですか?どうにかしてログオブジェクトの注入を強制できますか?
どのバージョンの grails を使用していますか? 1.0.4(最新)では、両方の状況でうまく機能しています。
新しい空のアプリを作成し、統合テストでサービス クラスを作成しました。
FooService.groovy:
class FooService {
def logSomething(message) {
log.error(message)
return true
}
}
FooServiceTests.groovy:
class FooServiceTests extends GroovyTestCase {
def fooService
void testSomething() {
assert fooService.logSomething("it works")
}
}
test-app だけを実行すると、次のログ メッセージが表示されます。
% grails test-app
Welcome to Grails 1.0.4 - http://grails.org/
....
-------------------------------------------------------
Running 1 Integration Test...
Running test FooServiceTests...
testSomething...[4174] service.FooService it works
SUCCESS
Integration Tests Completed in 440ms
-------------------------------------------------------
...
統合テストのみを実行する場合も機能します。
% grails test-app -integration
Welcome to Grails 1.0.4 - http://grails.org/
....
-------------------------------------------------------
Running 1 Integration Test...
Running test FooServiceTests...
testSomething...[4444] service.FooService it works
SUCCESS
Integration Tests Completed in 481ms
-------------------------------------------------------
....
ロガークラスをいじっていますか(または、以前の統合クラスまたは単体テストでロガーのメタクラスをオーバーライドし、メタクラスを再初期化していませんか?
私はこの正確な問題を抱えていましたが、mockLogging 機能を呼び出すことで非常に簡単に解決できます。
void testTheMagic() {
mockLogging(MyMagicService)
def testService = new MyMagicService()
...
}
(重要な場合は Grails 1.1.1 を使用)
私は 1.3.2 を使用しており、テストへのログインは正常に機能しています。テスト環境用に log4j 構成を指定したことを確認してください。