Springセキュリティ コア プラグインサービスを注入する抽象クラスを拡張するドメイン クラスがあります。
class Extra extends WithOwner {
String name
}
abstract class WithOwner {
transient springSecurityService
User user
def getCurrentUser() {
return springSecurityService.currentUser
}
def beforeValidate() {
if(!user) {
user = getCurrentUser()
}
}
Boolean isLoggedUserTheOwner(){
return (user?.id == getCurrentUser()?.id)
}
}
コントローラーのテストを実装したい。
@TestFor(ExtraController)
@Mock([Extra, User, UserRole, Role])
class ExtraControllerTests {
void testEdit() {
def utils = new TestUtils()
def user1 = utils.saveUser1()
populateValidParams(params)
def extra = new Extra(params)
extra.user = user1
assert extra.save() != null
params.id = extra.id
def model = controller.edit() // Line 69
assert model.extraInstance == extra
}
}
上記のテストを実行すると、次のようになります。
test-app ExtraController.testEdit --unit --echoOut | 1 つの単体テストを実行しています... 1/1 --testEdit からの出力-- | 失敗: testEdit(com.softamo.movilrural.ExtraControllerTests) | java.lang.NullPointerException: com.softamo.movilrural.WithOwner.getCurrentUser(WithOwner.groovy:8) で null オブジェクトのプロパティ 'currentUser' を取得できません com.softamo.movilrural.WithOwner.isLoggedUserTheOwner(WithOwner.groovy:18) でcom.softamo.movilrural.ExtraController.edit(ExtraController.groovy:39) で com.softamo.movilrural.ExtraControllerTests.testEdit(ExtraControllerTests.groovy:69) | 1 つの単体テストが完了し、853 ミリ秒で 1 つが失敗しました
次のようにセキュリティ サービスをモックしようとしましたが、成功しませんでした。
Extra.metaClass.springSecurityService = new MockSpringSecurityService(user1)
またはメソッドを嘲笑することさえあります
Extra.metaClass.getCurrentUser = { return user1 }
この問題を回避するにはどうすればよいでしょうか。