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)
}
}