关键词:
【中文标题】如何模拟从控制器测试类注入域类的服务?【英文标题】: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.movilrural.ExtraControllerTests) | java.lang.NullPointerException:无法在空对象上获取属性“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 个在 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类中使... 查看详情