Grails: Wie testet man ein Befehlsobjekt mit einem eingebauten Dienst?

Ich versuche, einen Controller zu testen, der ein Command-Objekt mit Datenbindung hat.

In das Befehlsobjekt ist ein Dienst eingefügt.

Aber wenn ich versuche, das Befehlsobjekt zu testen, wird die injizierte Dienstmethode niemals gefunden, da sie niemals "injiziert" wird.

Gibt es eine Möglichkeit, einen Dienst in einem Befehlsobjekt zu verspotten?

Testmethode

void testLoginPasswordInvalid() {
    mockRequest.method = 'POST'
    mockDomain(User, [new User(login:"freddy", password:"realpassword")])
    mockLogging(UserService) // userService mocked
    MockUtils.prepareForConstraintsTests(LoginCommand)

    def userService = new UserService()
    def user = userService.getUser("freddy")//Gets called and returns the mockDomain
    assert userService.getUser("freddy")//Passes

    def cmd = new LoginCommand(login:"freddy", password:"letmein")
    cmd.validate() // Fails (userService is nevr injected)
    controller.login(cmd)
    assertTrue cmd.hasErrors()
    assertEquals "user.password.invalid", cmd.errors.password
    assertEquals "/store/index", renderArgs.view
}

Die Methode getUser () des Benutzerservice wurde nicht gefunden

Cannot invoke method getUser() on null object
java.lang.NullPointerException: Cannot invoke method getUser() on null object

Code

Die Anmeldemethode des aufgerufenen Controllers,

def login = { LoginCommand cmd ->
  if(request.method == 'POST') {
     if(!cmd.hasErrors()){
       session.user = cmd.getUser()
       redirect(controller:'store')
     }
     else{
       render(view:'/store/index', model:[loginCmd:cmd])
     }
  }else{

    render(view:'/store/index')
  }
}

In das Befehlsobjekt ist ein "userService" eingefügt.

Der Validator ruft diesen Benutzerservice auf, um einen Benutzer zu finden

 class LoginCommand {

    def userService

    String login
    String password

    static constraints = {
      login blank:false, validator:{ val, cmd ->
          if(!cmd.userService.getUser()){
             return "user.not.found"
          }
      }
 }

Die userService.getUser () sieht so aus.

class UserService {

    boolean transactional = true

    User getUser(String login) {
        return User.findByLogin(login)

    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage