【问题标题】:Grails Spock unit test requires to mock transaction managerGrails Spock 单元测试需要模拟事务管理器
【发布时间】:2017-02-11 09:11:58
【问题描述】:

在 Grails 3.1.12 中,我想对服务进行单元测试:

@Transactional
class PlanService {
    List<Plan> getPlans(Map params) {
        def currentUser = (User)springSecurityService.getCurrentUser()
        return Plan.findAllByCompany(currentUser.employer, params)
    }
}

像这样:

@TestFor(PlanService)
@Mock([Plan, User, Company])
class PlanServiceSpec extends Specification {
    void "Retrieve plan from the current user"() {
        setup:
        // create and save entities here

        when: "the plans are retrieved"
        def params = null
        def plans = service.getPlans(params)

        then: "the result should only include plans associated to the current user's company"
        plans.size() == 2
}

从控制台运行测试:

grails> test-app my.PlanServiceSpec -unit

失败:

my.FundingPlanServiceSpec > Retrieve plan from the current user FAILED
java.lang.IllegalStateException at PlanServiceSpec.groovy:48

并在测试报告(HTML)中:

java.lang.IllegalStateException: No transactionManager was specified.
Using @Transactional or @Rollback requires a valid configured transaction manager.
If you are running in a unit test ensure the test has been properly configured
and that you run the test suite not an individual test method.

现在,如果我在服务中注释掉 @Transactional 注释,则测试通过,但这不是预期的实现。我可以通过模拟事务管理器来解决这个问题:

service.transactionManager = Mock(PlatformTransactionManager) {
    getTransaction(_) >> Mock(TransactionStatus)
}

但这似乎很尴尬,如果没有错的话。

是不是有什么我忘记调用的咒语了?

编辑:看起来和an old bug很像,但是已经关闭一年多了。

【问题讨论】:

    标签: unit-testing grails service mocking spock


    【解决方案1】:

    您是否尝试过 cmets 所说的解决问题的方法?如果没有,请尝试使用以下内容注释测试类:

    @TestMixin(DomainClassUnitTestMixin)
    

    然后:

    service.transactionManager = getTransactionManager()
    

    【讨论】:

    • 我完全忽略了这一点。这是一个更好的解决方法。谢谢。
    • 我将此解决方案与 grails 3.0.17 一起使用,并且不需要 @TestMixin。
    • 帮助了我。即使是单独注入的服务。 2.4.5
    【解决方案2】:

    在尝试测试事务服务时,在 grails 3.3.2 中遇到了同样的错误。

    添加 DataTest 接口为我解决了这个问题。

    class HelloServiceSpec extends Specification implements ServiceUnitTest<HelloService>, DataTest { }

    【讨论】:

    • 是的,上面的答案不适用于 Grails 3.3.x(我正在寻找答案)
    猜你喜欢
    • 2023-03-23
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 2014-06-21
    • 2016-06-17
    • 1970-01-01
    相关资源
    最近更新 更多