Unit testing 如何模拟从控制器测试类注入到域类中的服务?

Unit testing 如何模拟从控制器测试类注入到域类中的服务?,unit-testing,grails,spring-security,mocking,Unit Testing,Grails,Spring Security,Mocking,我有一个域类,它扩展了注入服务的抽象类 我想实现一个控制器测试 @TestFor(ExtraController) @Mock([Extra, User, UserRole, Role]) class ExtraControllerTests { void testEdit() { def utils = new TestUtils() def user1 = utils.saveUser1() populateValidParams(

我有一个域类,它扩展了注入服务的抽象类

我想实现一个控制器测试

@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
    }
}
如果我运行上述测试,我会得到:

测试应用程序ExtraController.testEdit--unit--echoot |正在运行1单元测试。。。第1页,共1页 --testEdit的输出-- |失败:testEdit(com.softamo.movilrural.ExtraControllerTests) |java.lang.NullPointerException:无法获取null对象的属性“currentUser” 位于com.softamo.movilrural.WithOwner.getCurrentUser(WithOwner.groovy:8) 位于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个单元测试,1个在853ms内失败

我曾试图这样嘲笑安全服务,但没有成功:

Extra.metaClass.springSecurityService = new MockSpringSecurityService(user1)
甚至嘲笑这种方法

Extra.metaClass.getCurrentUser = { return user1 }
你知道我该如何解决这个问题吗。

这应该可以:

controller.springSecurityService = new SpringSecurityService()
如果要在此服务中模拟getCurrentUser方法:

controller.springSecurityService.metaClass.getCurrentUser = { -> return user1 }
我不确定您是否可以在上面的一行中使用ommit
->
,所以请测试它。如果要在使用后或在其他测试用例之前清除此模拟方法,请使用以下命令:

controller.springSecutiryService.metaClass = null

Grails2.x支持使用“defineBeans”闭包为测试环境定义Springbean。 它支持控制器中的依赖注入等,我不确定它是否也适用于域对象。理论上,它应该在域对象/控制器/服务之间保持一致


请参阅“测试Springbeans”部分。

我发现了一篇关于这个问题的好文章:

这解释了如何将服务注入控制器,他的问题是如何在域对象中模拟服务。为了记录,您可以省略
->
并将其简化为
getCurrentUser={user1}
我尝试过这个方法,但没有效果。不知道如何为域类设置它。定义bean{springSecurityService(new MockSpringSecurityService(user1))}定义Springbean时,不需要执行new MockSpringSecurityService(),只需执行springSecurityService(MockSpringSecurityService)您好!我也有同样的问题。你为你的问题找到了解决办法吗?或者,您可以在没有单元测试自动连接的情况下,在域对象中插入服务?这个问题是否解决?您是否面临同样的问题。
controller.springSecutiryService.metaClass = null