4 Stimmen

Nicht möglich, die Grails Service-Methode zu verspotten, wenn der Controller im Unit-Test - MissingMethodException ist.

Ich erhalte die folgende Fehlermeldung beim Testen des Controllers - siehe unten den Code. Wie kann ich das korrigieren? Wenn ich die Service-Methode vom Controller aus aufrufe (run-app), funktioniert es einwandfrei.

Ausnahme:

groovy.lang.MissingMethodException: Keine Signatur der Methode: grails.test.GrailsMock.isOk() ist anwendbar für Argumenttypen: (java.lang.String) Werte: [H] bei ...VControllerSpec.test something(VControllerSpec.groovy:)

Klasse: VControllerSpec

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

@TestFor(VController)
@Mock(VService)
class VControllerSpec extends Specification {

    void "test something"() {
        given:
        def vServiceMock = mockFor(VService)
        vServiceMock.demand.isOk { String yeah -> return true }
        controller.vService = vServiceMock.createMock()

        when:
        def isO = vServiceMock.isOk("H") 

        then:
        isO == true     
    }
}

Klasse:VService

import grails.transaction.Transactional

@Transactional
class VService {
    def isOk = { String yeah ->     
        def isO = false
        return isO
    }
}

Danke, Steve

3voto

dmahapatro Punkte 48012

Angenommen, es gibt eine Aktion im VController wie:

def myAction() {
    vService.isOk('Hallo')
}

Der folgende Test sollte bestehen

void 'Test Service'() {
    gegeben:
    def vServiceMock = mockFor(FormatService)
    vServiceMock.demand.isOk { String yeah -> return true }
    controller.vService = vServiceMock.createMock()

    wenn:
    def isO = controller.myAction() 

    dann:
    isO == true
}

Es gibt ein paar Dinge zu optimieren, einschließlich der Verwendung einer Methode isOk anstelle einer Closure als bewährte Praxis.

0voto

Imran Mir Punkte 79

Es wird nicht erwartet, dass eine Methode getestet wird, die gemockt wird. Wenn wir eine Methode mocken, nehmen wir einfach an, dass ihre Implementierung korrekt ist und bereits getestet wurde (in einem anderen Unittest). Der Zweck des Mockens besteht darin, unsere Testfokussierung auf eine begrenzte Anzahl von Codezeilen zu beschränken (meistens nur eine Methode), in Ihrem Fall die Controller-Aktion. Daher hätte der obige Testfall folgendermaßen geschrieben werden können:

Angenommen, Ihre Aktion sieht so aus:

def myAction(){
 [iso: vServiceMock.isOk()] // angenommen isOk gibt boolean true zurück
}

void "test myAction"() {
        given:
        def vServiceMock = mockFor(VService)
        vServiceMock.demand.isOk { String yeah -> return true }
        controller.vService = vServiceMock.createMock()

        when:
        def model = controller.myAction() 

        then:
        model.iso   // Sie können den Vergleich mit true überspringen 
    }

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