v1p
v1p

Reputation: 133

NullPointerException for Service-in-Service Injection during test-app

Recently came across with a weird scenario, that dependency injection for a service within a service, threw NPE while running test-app

Reason for service-in-service injection is to make the GORM/criteriaBuilder as DRY as possible. So following are my two services.

Following class SearchService1.groovy is implemented to provide search capability.

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

Class SearchService2.groovy uses the search closure of SearchService1 class

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

Now, the above stated code works pretty well in run-app mode. But for Integration test written for SearchService2 throws NPE as follows :

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)

Am I missing something very basic here ? Any thoughts are greatly appreciated. Many Thnx :)

Snippet from TestClass :

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

Upvotes: 1

Views: 1142

Answers (2)

jenk
jenk

Reputation: 1043

try this:

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

but use standard Grails service naming convention and placement

Upvotes: 0

v1p
v1p

Reputation: 133

Woah ! Got rid of this stupid error by this workaround.

To TestClass, inject the searchService1 to searchService2 object like this :

def searchService2
def searchService2.searchService1 = new SearchService1()

But come on ! Is this the right way to do it ? Can anyone explain the above error by the way, that why a Service-in-Service is not instantiated while running test-app.

Upvotes: 1

Related Questions