我在自定义验证器中有一个带有约束的命令对象:
class UserPasswordCommand {
String currentPassword
//other fields....
static constraints = {
currentPassword validator: { currPass, upc ->
Holders.applicationContext.passwordEncoder.isPasswordValid(
Holders.applicationContext.springSecurityService.currentUser.password, currPass, null)
}
}
}
但是在单元测试中调用new UserPasswordCommand(...)时,我得到以下信息:
java.lang.NullPointerException:无法在空对象上获取属性“currentUser”
所以看起来 springSecurityService = null (如预期的那样)。我尝试了不同的动作来模拟或“元类”它,但没有成功。
请告知是否有更好的方法在命令对象中使用来自 applicationContext 的 bean 或在 Holders.applicationContext 中模拟 bean 的一些方法。
提前致谢!
更新
将以下内容放置到setup()
部分:
def setup() {
def appContext = Mock(ApplicationContext)
def springSecurityService = Mock(SpringSecurityService)
appContext.springSecurityService >> springSecurityService
Holders.metaClass.static.applicationContext = { appContext }
}
但是没有效果。springSecurityService在从Holders检索到的applicationContext中为空。我究竟做错了什么?