Grails Quartz作业集成测试 - 非自动作业

时间:2012-05-03 14:19:54

标签: grails quartz-scheduler integration-testing

我正在为grails应用程序中的Quartz Job编写Integration测试。 我在 grails-app / jobs 文件夹中找到了Job,如果我启动应用程序就可以了。问题是我想在集成测试中得到它,但是autowire不会工作。测试如下:

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

    def testExecute(){
         //test logic
    }

}

但它失败了因为myJob为空......有些帮助吗?

1 个答案:

答案 0 :(得分:4)

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

编辑回应评论:

我从来没有从应用程序上下文中获取服务,因此可能会有效。我可能会测试它的方式如下:

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

class MyJob {
    def myServiceA
    def myServiceB

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

    }        
}

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

@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
}

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