2012-06-13 16 views
5

別のサービスに依存するGrailsサービスをテストするベストプラクティスは何ですか? デフォルトのミックスインが正しくなどのために、テスト中のサービスを注入TestFor:複数のサービスによるGrailsの統合テスト

@TestFor(TopService) 
class TopServiceTests { 
    @Test 
    void testMethod() { 
     service.method() 
    } 
} 

をしかしTopService(サービス)の私のインスタンスはInnerServiceのように、別のサービスに依存している場合:

class TopService { 
    def innerService 
} 

innerServiceはできません依存性注入はこの変数を埋めるようには見えません。私はどのように進めるべきですか?

+0

あなたのテストで 'GroovyTestCase'を拡張してみてください。 –

答えて

8

統合テストでは@TestForアノテーションを使用しないでください。extend GroovyTestCaseです。テストアノテーションは単体テストでのみ使用されます(統合テストで使用された場合、特に@Mock注釈)。あなたはそれらの悪い行動の1つを今見ています。

あなたがGroovyTestCaseを拡張する場合は、その後、ちょうどあなたのテストの上部に

def topService 

を持つことができ、それはそれのすべては、依存関係が注入されていますを注入しますよ。

単体テストの場合、関連するサービスの新しいインスタンスをsetUpメソッドでサービスに追加したいだけです。ちょうどのように:

@TestFor(TopService) 
class TopServiceTests { 
    @Before public void setUp() { 
     service.otherService = new OtherService() 
    } 
    ... 
+0

ありがとう!私は最終的にあなたの説明でそれを理解しました;) http://stackoverflow.com/questions/2272677/dependency-injection-in-grails-integration-testsからのコメントで私は少し間違っていました "統合テストはGrailsUnitTestCaseを拡張すべきではありません" 。私はGroovyTestCaseとGrailsUnitTestCaseの違いを完全に把握していません... – Wavyx

+1

最大の違いは、ユニットテストケースがsetUpとtearDownのmetaClassを嘲笑して混乱させてしまうことです。黙っていることは、すでに実物が注入されているので、統合テストには必要ないものです。また、統合テストが終了したときに、ユニットテストのtearDownが実行され、そこに存在するはずのmetaClass(動的GORMメソッドのような)への変更を取り除くことができず、その後の統合テストが期待していることを意味します。 –

1

私はCustomerRegistrationServiceTestを持っていて、私のCustomerRegistrationServiceはPasswordServiceに依存しています。

私CustomerRegistrationServiceが普通のようにそれをautowires

:私のCustomerRegistrationServiceTestで

class CustomerRegistrationService { 
    def passwordService 

私が持っている:私はCustomerRegistrationServiceをテストするとき

@TestFor(CustomerRegistrationService) 
@Mock(Customer) 
class CustomerRegistrationServiceTests extends GrailsUnitTestMixin { 

    void setUp() { 
     mockService(PasswordService) 
    } 

をだから、PasswordServiceにアクセスすることが可能である

+1

ありがとうございます。確かに、嘲笑は行こうとしているようですが、単体テストのIMHOの方がはるかです。統合テストでは、本格的な環境をテストしたいと思います。 – Wavyx

関連する問題