3 Stimmen

Kann die Eigenschaft 'config' des Null-Objekts nicht abrufen - Grails Service Spock Testing

Wenn Sie Spock-Testfälle mit UnitSpec für Dienstklassen in einer Grails-Anwendung ausführen, wird grailsApplication als null zurückgegeben.

Fehler - Kann Eigenschaft 'config' nicht auf null-Objekt abrufen

Kann mir jemand sagen, wie man grailsApplication beim Testen von Serviceklassen mit Spock konfiguriert.

Ich habe viel gegoogelt, aber mein Problem nicht gelöst.

Hier ist der Code.

  def accountServiceMock = Mock(AccountService)
    def accountClientService = new AccountClientService()
def setup(){

    accountClientService.accountWS = accountServiceMock
    accountClientService.basicAuthInterceptor = authenticatorServiceMock        
}

def "Test account by status() " (){
    setup:
    def mockAccountStatus = "ACTIVE"
    mockDomain(Account, [accountInstance])
    accountClientService.grailsApplication = grailsApplication

    when:
    accountClientService.getAccountByStatus(mockAccountStatus)  //Aufruf des Webdienstes durch Abrufen der URL aus der default.properties-Datei, die den Kontext enthält

    then:
    Account.count() != 0

    where:
    accountInstance = new Account(10L, "ACTIVE","1234", "firstName", "LastName")
}

In der AccountService-Klasse ruft die Methode getAccountByStatus() den Webservice mit der URL = grailsApplication.config.ACCOUNTWEBSERVICEURL auf, die sich in der default.properties-Datei befindet. Aber wenn ich den Spock-Testfall ausführe, wird ein Fehler geworfen

Kann Eigenschaft 'config' des Null-Objekts nicht abrufen

3voto

topr Punkte 4292

Hier ist es:

import spock.lang.Specification
import grails.test.mixin.*

@TestFor(SomeService)
class SomeServiceIntegrationSpecSpec extends Specification {

    def "gib mir den Konfigurationswert"() {
        given: config.value = '123'
        expect: service.valueFromConfig == '123'
    }
}

...und nur zur Referenz, die SomeService Klasse:

class SomeService {

    def grailsApplication // autowired

    def getValueFromConfig() {
        grailsApplication.config.value
    }
}

Das obige Beispiel ist ziemlich einfach, aber zeigt ausreichend, wie es gemacht werden sollte. Die Autowiring von grailsApplication funktioniert dank der @TestFor Annotation. Wenn dies nicht zu Ihrem Fall passt, werden weitere Informationen benötigt:

  • Grails Version
  • Spock Version (Grails Plugin-Version wird ausreichen)
  • wo wird die NPE geworfen? Im getesteten Service selbst oder in einem Mock
  • handelt es sich um einen Grails Unit- oder Integrationstest
  • Der vollständige Test-Quellcode wäre hilfreich

Unabhängig von Ihrem genauen Fall können Sie immer einfach die Konfiguration wie hier von j4y beantwortet (letzte Antwort zum aktuellen Zeitpunkt) mocken.

Wenn Sie Unit-Tests durchführen, denken Sie daran, dass Config.groovy nicht ausgelesen wird. Eine weitere erwähnenswerte Sache ist, dass es kein Wunder ist, wenn die NPE von einem Objekt, das mit Mock() oder dem 'new'-Schlüsselwort erstellt wurde, geworfen wird, da dort kein Autowiring vorhanden ist.

1voto

Ich hatte ein ähnliches Problem. Hatte tatsächlich ein Domain-Objekt, das auf grailsApplication verwies.

Gelöst durch Zuweisen von grailsApplication von Test zu Domain:

@TestMixin(GrailsUnitTestMixin)
@TestFor(MyService)
@Mock([MyDomain])
class MyServiceSpec extends Specification {

    myTest() {

        grailsApplication.config.myValue = "XXX"

        def myDomain = MyDomain()

        myDomain.grailsApplication = grailsApplication

    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X