【问题标题】:How to mock service in groovy/src class under test with Grails 3.3.x如何使用 Grails 3.3.x 在 groovy/src 类中模拟服务
【发布时间】:2017-11-25 13:10:20
【问题描述】:

我最近升级到 grails 3.3.1 并意识到 grails.test.mixin.Mock 已被拉到单独的项目中,根据我的理解 org.grails:grails-test-mixins:3.3.0,该项目只是为了向后兼容而构建的。

我一直在使用@Mock 注释来模拟注入到被测 groovy/src 类的 Grails 服务。在这种情况下,模拟协作服务的策略是什么? Spock 有什么我可以使用的东西还是我应该回退到 grails-test-mixins 插件?

被测类: 导入gra

ils.util.Holders

import grails.util.Holders

class SomeUtilClass {

    static MyService myService = Holders.grailsApplication.mainContext.getBean("myService")

    static String myMethod() {
        // here is some code
        return myService.myServiceMethod()
    }
}

我的测试规范(Grails 3.2.1):

import grails.test.mixin.Mock
import spock.lang.Specification

@Mock([MyService])
class ValidatorUtilsTest extends Specification {

    def 'my test'() {
        when:
            def result = SomeUtilClass.myMethod()
        then:
            result == "result"
    }
}

【问题讨论】:

    标签: grails spock grails-3.3


    【解决方案1】:

    由于您在 SomeUtilClass 中使用 Holders.grailsApplication,您可以尝试添加 @Integration 注解:

    import grails.testing.mixin.integration.Integration
    import spock.lang.Specification
    @Integration
    class ValidatorUtilsTest extends Specification {
    
        def 'my test'() {
            when:
            def result = SomeUtilClass.myMethod()
            then:
            result == "result"
        }
    }
    

    不确定,但希望它对你有用。

    【讨论】:

    • 嗯,这对我来说实际上是最干净的解决方案,因为我也想测试 MyService。所以集成服务是最有意义的。谢谢...
    • 很高兴听到这个消息:D。
    【解决方案2】:

    试试这个代码

    @TestMixin(GrailsUnitTestMixin)
    @Mock([your domains here])
    class ValidatorUtilsTest extends Specification {
    
        static doWithSpring = {
           myService(MyService)
        }
    
        def 'my test'() {
            when:
                def result = SomeUtilClass.myMethod()
            then:
                result == "result"
        }
    }
    

    【讨论】:

    • 好吧,这不起作用,因为依赖注入是通过 Holders 手动完成的。它抛出异常java.lang.IllegalArgumentException: GrailsApplication not found。我仍然可以使用@Mock 有效的方法。我在问是否有另一种更好的方法...
    【解决方案3】:

    删除@Mock 注释并在您的测试类中实现ServiceUnitTest<MyService>。

    【讨论】:

      猜你喜欢
      • 2012-05-25
      • 2016-01-30
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      相关资源
      最近更新 更多