gpt4 book ai didi

unit-testing - 如何正确地将 grails 单元测试辅助方法移动到单独的文件中?

转载 作者:行者123 更新时间:2023-12-04 04:40:30 24 4
gpt4 key购买 nike

我有一些常用的单元测试辅助方法放入单独的文件中。例如,这个想法是允许我的 XYZTests.groovy 调用 TestHelper.getUserObject() 以获得完全初始化的用户实例。

现在的问题是,有一个 springSecurityService.encodePassword(pw)在用户的beforeInsert()中被调用这总是失败,因为 TestHelper.groovy 中没有 springSecurityService 的模拟。

java.lang.NullPointerException: Cannot invoke method encodePassword() on null object

用户.groovy :
def beforeInsert() {
// ...
password = springSecurityService.encodePassword(pw)
// ...
}

注意:我想避免任何 mock TestHelper.groovy 以便在集成测试中也使用它的方法。

尽管如此,即使我尝试调用 mockFor()在 TestHelper.groovy 的任何地方,我都会得到一个 MME:
No signature of method: static myproject.TestHelper.mockFor() is applicable for argument types: (java.lang.Class, java.lang.Boolean) values: [class grails.plugins.springsecurity.SpringSecurityService, true]
groovy.lang.MissingMethodException: No signature of method: static myproject.TestHelper.mockFor() is applicable for argument types: (java.lang.Class, java.lang.Boolean) values: [class grails.plugins.springsecurity.SpringSecurityService, true]
at myproject.TestHelper.mockSpringSecurityService(TestHelper.groovy:59)
at myproject.TestHelper$mockSpringSecurityService.callStatic(Unknown Source)
at myproject.TestHelper.getUserObject(TestHelper.groovy:47)
at myproject.TestHelper$getUserObject.call(Unknown Source)
at myproject.UserTests.setUp(UserTests.groovy:26)

注:我目前 mock springSecurityService.encodePassword像这样:
// in UserTests.groovy
protected void setUp() {
// mockDomain(...) and such here

def u = TestHelper.getUserObject("Pummel")
u.springSecurityService = mockSpringSecurityService()
assert u.save()
}
private mockSpringSecurityService() {
def ssService = mockFor(SpringSecurityService,true)
ssService.metaClass.encodePassword() { password ->
"08a2d3c63bf9fc88276d97a9e8df5f841fd772724ad10f119f7e516f228b74c6"
}

ssService
}
  • 关于如何在仅将所有模拟留在单元测试中的同时使用帮助程序类的任何想法?
  • 我最好将 TestHelper.groovy 文件放在哪里,以便在集成和单元测试中使用它?

  • 请注意,当我将所有帮助程序直接移动到 UserTests.groovy 时,一切正常!

    最佳答案

    解决方案是 制止调用任何user.save() TestHelper.groovy .

    这是有道理的,因为对于许多(单元)测试来说,持久(保存)实例无论如何都是不必要的。

    另一方面实际上很多情况需要一个未保存的实例。 (例如,为了测试 .save() 本身的某些效果)

    一个工作示例用于集成测试 将会:

    def user = TestHelper.getUserObject()
    user.save()

    对于 单元测试:
    def user = TestHelper.getUserObject()
    user.springSecurityService = new SpringSecurityService() // or the described mock accordingly
    user.save()

    这使任何模拟都远离 TestHelper.groovy

    关于unit-testing - 如何正确地将 grails 单元测试辅助方法移动到单独的文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5970244/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com