【问题标题】:Grails Quartz Job Integration test - Not autowired JobGrails Quartz 作业集成测试 - 未自动装配作业
【发布时间】:2012-05-03 14:19:54
【问题描述】:

我正在为 grails 应用程序中的 Quartz Job 编写集成测试。 我在 grails-app/jobs 文件夹中有工作,如果我启动应用程序,它就可以工作。问题是我想在集成测试中得到它,但自动接线不起作用。测试是这样的:

class MyJobTest{
    MyJob myJob
    def setUp(){
        assert myJob != null
    }

    def testExecute(){
         //test logic
    }

}

但它失败了,因为 myJob 为空...有什么帮助吗?

【问题讨论】:

    标签: grails quartz-scheduler integration-testing


    【解决方案1】:

    Quartz Jobs 不像服务在测试环境下那样自动装配。 Quartz 作业的文档还明确指出,默认情况下它不会在测试环境下按计划执行(如果您愿意,您可以更改它,但我不会)。我会在你的setUp 中实例化myJob = new MyJob() 并调用execute() 方法来测试它。如果您正在尝试测试触发器,您可能想找到一种方法来查看 triggers {} 内部的内容,或者检查元类?

    编辑回应评论:

    我从来没有从应用程序上下文中获取服务,所以这可能会起作用。我可能会测试它的方式如下:

    假设你的班级看起来像这样:

    class MyJob {
        def myServiceA
        def myServiceB
    
        def execute() {
            if(myJobLogicToDetermineWhatToDo) {
                myServiceA.doStuff(parameter)
            } else {
                myServiceB.doStuff(parameter)
            }
    
        }        
    }
    

    您真正想要在这里测试的是myJobLogicToDetermineWhatToDo。我假设您已经(或可以轻松编写)针对您的服务 myServiceA 和 myServiceB 的集成和/或单元测试,以确保它们正常工作。然后我会编写单元测试来测试你的作业的逻辑/接线到适当的服务。

    @Test
    void routeOne() {
        def job = new MyJob()
        def myServiceA = new Object()
        def expectedParameter = "Name"
        def wasCalled = false
        myServiceA.metaClass.doStuff = {someParameter ->
            assert expectedParameter == someParameter
            wasCalled = true
        }
        job.myServiceA = myServiceA
        //Setup data to cause myServiceA to be invoked
    
        job.execute()
    
        assert wasCalled
    }
    

    然后对您通过工作的所有路线重复此过程。这样,您可以将测试隔离到尽可能小的部分,并测试您正在调用的对象的逻辑,而不是它正在使用的服务。我假设您正在使用服务,因为系统的另一部分正在使用其中的逻辑。如果您正在通过该作业测试服务并且由于某种原因该作业消失了,那么您必须重新编写测试以直接调用该服务。我建议您使用测试直接测试服务并模拟这些服务调用的测试的方式。如果工作消失,您只需删除与之关联的测试,您就不会失去任何测试覆盖率。有点啰嗦,但这就是我测试它的方式。

    【讨论】:

    • 非常感谢!问题是 Quartz 在执行中有一些逻辑并且它执行服务的一些方法......所以在测试中我必须实例化 Job 类并自己从应用程序上下文中注入服务,对吗?
    • 我找到了另一个解决方案:grails石英插件中有一个命令:grails install-quartz-config。这将创建 QuartzConfig.groovy 文件,可以在其中启用加载 Quartz 内容以进行测试:environments { test { quartz { autoStartup = false } } } 更多详细信息:Grails documentation
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    相关资源
    最近更新 更多