Sto provando a testare un controller con un oggetto Command con associazione dati.Grails: Come si esegue il test dell'unità su un oggetto comando con un servizio immesso in esso
L'oggetto comando ha un servizio immesso in esso.
ma quando provo testare il comando Oggetto il metodo del servizio iniettato non è mai trovato come non è mai "iniettata"
C'è un modo per deridere un servizio all'interno di un oggetto di comando?
Metodo
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
}
Il metodo getUser() della userService non si trova
Cannot invoke method getUser() on null object
java.lang.NullPointerException: Cannot invoke method getUser() on null object
Codice
Il metodo di login del controller di essere chiamato,
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')
}
}
All'oggetto comando è stato inserito un "userService".
Il validatore chiama questo userService per trovare un utente
class LoginCommand {
def userService
String login
String password
static constraints = {
login blank:false, validator:{ val, cmd ->
if(!cmd.userService.getUser()){
return "user.not.found"
}
}
}
L'userService.getUser() assomiglia a questo.
class UserService {
boolean transactional = true
User getUser(String login) {
return User.findByLogin(login)
}
}
Grazie, questo ha funzionato a meraviglia e ora capisco più – Daxon