Grails: ¿Cómo pruebas unitarias de un objeto de comando con un servicio inyectado en él?
Estoy intentando probar un controlador que tiene un objeto de comando con enlace de datos.
El objeto de comando tiene un servicio inyectado en él.
Pero cuando intento probar el objeto de comando, el método de servicio inyectado nunca se encuentra, ya que nunca se "inyecta"
¿Hay una manera de burlarse de un servicio dentro de un objeto de comando?
Método de prueba
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
}
El método getUser () del servicio de usuario no se encuentra
Cannot invoke method getUser() on null object
java.lang.NullPointerException: Cannot invoke method getUser() on null object
Código
El método de inicio de sesión del controlador que se llama,
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')
}
}
El objeto de comando tiene un "servicio de usuario" inyectado en él.
El validador llama a este servicio de usuario para encontrar un usuario.
class LoginCommand {
def userService
String login
String password
static constraints = {
login blank:false, validator:{ val, cmd ->
if(!cmd.userService.getUser()){
return "user.not.found"
}
}
}
El userService.getUser () tiene este aspecto.
class UserService {
boolean transactional = true
User getUser(String login) {
return User.findByLogin(login)
}
}