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

     2023-02-27     42

关键词:

【中文标题】如何模拟从控制器测试类注入域类的服务?【英文标题】:How to mock a service injected in a domain class from a Controller Test Class? 【发布时间】:2012-05-03 18:50:03 【问题描述】:

我有一个域类,它扩展了一个注入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)
    

我想实现一个控制器测试。

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

甚至模拟方法

Extra.metaClass.getCurrentUser =  return user1 

知道如何解决这个问题。

【问题讨论】:

您好!我遇到了同样的问题。您是否为您的问题制定了解决方案?或者,也许您可​​以在没有单元测试自动装配的情况下在域对象中注入服务? 这个问题好运吗?,面临同样的问题。 【参考方案1】:

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

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

【讨论】:

我试过这个,但不起作用。不知道如何为域类设置它。 defineBeans springSecurityService(new MockSpringSecurityService(user1)) 定义spring bean的时候不需要new MockSpringSecurityService(),只需springSecurityService(MockSpringSecurityService)【参考方案2】:

这应该可行:

controller.springSecurityService = new SpringSecurityService()

如果你想在这个服务中模拟 getCurrentUser 方法:

controller.springSecurityService.metaClass.getCurrentUser =  -> return user1 

我不确定你是否可以在上面的一行中省略->,所以测试一下。如果您想在使用后或另一个测试用例之前清除此模拟方法,请使用:

controller.springSecutiryService.metaClass = null

【讨论】:

这解释了如何将服务注入控制器,他的问题是如何在域对象中模拟服务。 为了记录,您可以省略->并将其简化为getCurrentUser = user1 【参考方案3】:

我发现了一篇关于这个问题的好文章:Inject springSecurityService Into Grails Domain Class for Controller Unit Testing

【讨论】:

在测试控制器方法时,Spring MVC 4.2.6 版似乎没有将模拟服务注入控制器

】在测试控制器方法时,SpringMVC4.2.6版似乎没有将模拟服务注入控制器【英文标题】:SpringMVCrelease4.2.6seemsdoesnotinjectmockserviceintothecontrollerwhentestingcontrollermethod【发布时间】:2016-06-2022:10:25【问题描述】:我确实搜索并遵循了为Spr... 查看详情

如何从 Grails 控制器和视图外部引用 Grails 域类字段?

】如何从Grails控制器和视图外部引用Grails域类字段?【英文标题】:HowtoreferenceaGrailsdomainclassfieldsfromoutsideoftheGrailscontrollerandview?【发布时间】:2010-09-2815:26:33【问题描述】:我有域类:classChildstatichasMany=[toys:Toy]StringnameSettoysclassT... 查看详情

c#依赖注入和控制反转的书籍

...好处时实现类的解耦,利于程序拓展、单元测试、自动化模拟测试等。2、控制反转(InversionofControl:IOC):控制反转只是一个概念,也就是将创建对象实例的控制权(原本是程序员)从代码控制权剥离到IOC容器中控制。 查看详情

Grails:具有域类的单元测试控制器方法

】Grails:具有域类的单元测试控制器方法【英文标题】:Grails:Unittestingcontrollermethodwithdomainclass【发布时间】:2015-02-2203:06:24【问题描述】:我有一个简单的grails控制器:classAuthorControllerdefindex()defauthors=Author.findByFirstName("Albert")ren... 查看详情

为啥域类静态方法不能从 grails“服务”内部工作?

...我希望grails服务能够访问域静态方法、查询等。例如,在控制器中,我可以调用IncomingCall.c 查看详情

如何将 Grails 域类映射到 DTO?

】如何将Grails域类映射到DTO?【英文标题】:HowdoImapGrailsDomainClassestoDTOs?【发布时间】:2014-09-0623:00:07【问题描述】:我有一个带有域类的Grails项目。这个持久类应该映射到JavaDTO。我发现了一个非常古老的Grails插件here,它并不... 查看详情

如何在域类中将 Taglib 作为函数调用

...静态资源插件(http://www.grails.org/Static+Resources+Plugin)。这在控制器中完美运行:deftstLink=resourceLinkTo(dir:"docs/$identif 查看详情

如何在 Spring Boot 中将属性注入测试类?

】如何在SpringBoot中将属性注入测试类?【英文标题】:HowtogetpropertiesinjectedintotestclassinSpringBoot?【发布时间】:2020-02-0702:32:41【问题描述】:如何将application-test.properties中的属性加载到SpringBoot中的测试类中?我做错了什么但无法... 查看详情

PHPUnit 模拟一个抽象类的所有方法

】PHPUnit模拟一个抽象类的所有方法【英文标题】:PHPUnitmockallmethodsofanabstractclass【发布时间】:2013-04-1619:40:36【问题描述】:我有一个直接从PHPUnit_Framework_TestCase派生的PHPUnit测试用例。在此类的测试中,我需要为某些服务对象获... 查看详情

将模拟类注入方法以单元测试方法

】将模拟类注入方法以单元测试方法【英文标题】:Injectmockclassintomethodtounittestmethod【发布时间】:2015-01-2318:04:07【问题描述】:我正在尝试对依赖于另一个类的方法进行单元测试。该方法调用该类上的类方法,本质上是这样的... 查看详情

如何使用@WebMvcTest 春季测试在模拟服务中注入模拟的restTemplate

】如何使用@WebMvcTest春季测试在模拟服务中注入模拟的restTemplate【英文标题】:HowtoinjectmockedrestTemplateinmokedservicewith@WebMvcTestspringtest【发布时间】:2022-01-2322:10:40【问题描述】:我正在尝试使用@WebMvcTest并使用@MockBean模拟我的服务... 查看详情

如何使用 Typhoon 为集成测试注入虚假、存根或模拟依赖项

...试使用KIF编写集成测试。我的问题是:如何为特定的视图控制器注入存根、模拟或假依赖?每个使用数据模型、http客户端、存储管理器等依赖项的视图控制器都 查看详情

如何从插件将控制器脚手架到域类?

】如何从插件将控制器脚手架到域类?【英文标题】:Howtoscaffoldcontrollertoadomainclassfromplugin?【发布时间】:2012-11-1306:15:39【问题描述】:我安装了一个插件并想从插件中构建一个域类。对于我的项目自己的域类Foo,我将scaffold=tru... 查看详情

具有剩余模板的控制器类的单元测试

】具有剩余模板的控制器类的单元测试【英文标题】:unittestingofcontrollerclasswhichhasresttemplate【发布时间】:2022-01-1603:03:06【问题描述】:我已经尝试在控制器类上进行测试,它不是模拟控制器类中的其余模板。@RestControllerpubliccla... 查看详情

使用注入对 NestJS 控制器进行单元测试

】使用注入对NestJS控制器进行单元测试【英文标题】:UnittestingNestJScontrollerwithinjection【发布时间】:2020-08-2704:36:54【问题描述】:我需要为使用NestJS注入的控制器进行单元测试。我不知道如何模拟和监视此服务(MyEmitter)。我需要... 查看详情

grails - 找不到域类

...012-01-0407:44:00【问题描述】:我有域User(在域目录中)和控制器UserController(在控制器目录中)。我还有控制器AdminController(在控制器/管理目录中)。我想在AdminController中使用用户类。当我这样做时,我遇到了无法找到用户类的... 查看详情

php中的服务容器与依赖注入的思想(代码片段)

...例服务容器bindmake依赖注入当A类需要依赖于B类(比如:控制器类调用Redis类实现Redis操作,就是控制器依赖Redis实现Redis操作。),也就是说需要在A类中实例化B类的对象来使用时候,如果B类中的功能发生改变,也会导致A类中使... 查看详情

php中的服务容器与依赖注入的思想(代码片段)

...例服务容器bindmake依赖注入当A类需要依赖于B类(比如:控制器类调用Redis类实现Redis操作,就是控制器依赖Redis实现Redis操作。),也就是说需要在A类中实例化B类的对象来使用时候,如果B类中的功能发生改变,也会导致A类中使... 查看详情