我有一个域类,它扩展了一个注入(inject) spring security core plugin 的抽象类服务。

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) 
    } 
} 

我想实现一个 Controller 测试。
@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 of 1
--testEdit 的输出--
|失败:testEdit(com.softamo.movi​​lrural.ExtraControllerTests)
| java.lang.NullPointerException:无法在空对象上获取属性“currentUser”
在 com.softamo.movi​​lrural.WithOwner.getCurrentUser(WithOwner.groovy:8)
在 com.softamo.movi​​lrural.WithOwner.isLoggedUserTheOwner(WithOwner.groovy:18)
在 com.softamo.movi​​lrural.ExtraController.edit(ExtraController.groovy:39)
在 com.softamo.movi​​lrural.ExtraControllerTests.testEdit(ExtraControllerTests.groovy:69)
|完成 1 个单元测试,1 个在 853 毫秒内失败

我曾尝试像这样模拟安全服务但没有成功:
Extra.metaClass.springSecurityService = new MockSpringSecurityService(user1) 

甚至 mock 该方法
Extra.metaClass.getCurrentUser = { return user1 } 

知道我该如何解决这个问题。

请您参考如下方法:

Grails 2.x 支持使用'defineBeans' 闭包为测试环境定义spring bean。
它支持 Controller 等中的依赖注入(inject),我不确定它是否也适用于域对象。从理论上讲,它应该在域对象/ Controller /服务之间保持一致

http://grails.org/doc/latest/guide/single.html#testing -“测试 Spring Beans”部分。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!