1

最近、奇妙なシナリオに遭遇しました。サービス内のサービスへの依存性注入が、 test-appの実行中にNPEをスローしました。

サービスインサービスインジェクションの理由は、GORM/criteriaBuilderを可能な限りドライにすることです。以下は私の2つのサービスです。

次のクラスSearchService1.groovyは、検索機能を提供するために実装されています。

class SearchService1{
def search = { ...//Calls to local closures to build a dynamic criteria }
...
}

クラスSearchService2.groovyは、SearchService1クラスの検索クロージャーを使用します

class SearchService2{
     def searchService1
     ...
     def searchEntity(){
        searchService1.search()
      }
   }

さて、上記のコードはrun-appモードでかなりうまく機能します。しかし、SearchService2用に作成された統合テストの場合、次のようにNPEがスローされます。

Cannot invoke method searchEntity() on null object
java.lang.NullPointerException: Cannot invoke method search() on null object
at com.myapp.service.SearchService2.searchEntity(SearchService2.groovy:326)
at com.myapp.service.SearchService2$searchEntity$0.callCurrent(Unknown Source)
at com.myapp.service.SearchService2.searchEntity(SearchService2.groovy:295)
at com.myapp.service.SearchService2$searchEntity.call(Unknown Source)
at com.myapp.integration.SearchService2Tests.testWhenSearch(SearchService2Tests.groovy:125)

ここで非常に基本的なものが欠けていますか?どんな考えでも大歓迎です。多くのThnx:)

TestClassからのスニペット:

class SearchService2Tests extends GroovyTestCase{
 ...
 def searchService2
 ...
 void testWhenSearch(){
    def resultSet = searchService2.searchEntity() //This is the line throwing NPE
    ...
  }
}
4

2 に答える 2

1

うわー!この回避策により、このばかげたエラーを取り除きました。

TestClassにするには、次のようにsearchService1をsearchService2オブジェクトに挿入します。

def searchService2
def searchService2.searchService1 = new SearchService1()

しかし、さあ!これは正しい方法ですか?ちなみに、test-appの実行中にService-in-Serviceがインスタンス化されない理由について、上記のエラーを誰かが説明できますか?

于 2012-10-31T12:59:27.007 に答える
0

これを試して:

class SearchService2Tests extends GroovyTestCase {
    ...
    def searchService1
    def searchService2
    ...
    void testWhenSearch(){
        def resultSet = searchService2.searchEntity()
        ...
    }
}

ただし、標準のGrailsサービスの命名規則と配置を使用します

于 2012-11-01T08:41:59.057 に答える