데이터 바인딩이있는 Command 객체를 가진 컨트롤러 을 테스트하려고합니다.Grails : 서비스를 삽입 한 커맨드 객체를 어떻게 단위 테스트합니까?
명령 개체에 서비스가 주입되었습니다. 내가 명령을 테스트 할 때이
명령 객체 내부의 서비스를 조롱 할 수있는 방법이 있나요 "주입 없다"결코로
그러나 주입 된 서비스 방법 이 발견되지 않습니다 객체?
userService의 인 getUser() 메소드
Cannot invoke method getUser() on null object
java.lang.NullPointerException: Cannot invoke method getUser() on null object
코드
컨트롤러 로그인 메소드가 호출되고 발견되지
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
}
시험 방법,
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')
}
}
명령 개체에는 "userService"가 삽입되어 있습니다.
유효성 검사기는
class LoginCommand {
def userService
String login
String password
static constraints = {
login blank:false, validator:{ val, cmd ->
if(!cmd.userService.getUser()){
return "user.not.found"
}
}
}
userService.getUser()이 보이는 사용자를 찾으려면이 userService를 호출합니다.
class UserService {
boolean transactional = true
User getUser(String login) {
return User.findByLogin(login)
}
}
감사 모의 객체에 다른 방법을 조회 할 수
,이 치료 을 근무하고 지금은 이해가 더 – Daxon