gpt4 book ai didi

Grails Quartz 作业集成测试 - 不是 Autowiring 的作业

转载 作者:行者123 更新时间:2023-12-01 01:18:56 25 4
gpt4 key购买 nike

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

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

def testExecute(){
//test logic
}

}

但它失败了,因为 myJob 为空...一些帮助?

最佳答案

Quartz 作业不像测试环境下的服务那样 Autowiring 。 Quartz 作业的文档还明确指出,默认情况下它不会在测试环境下按计划执行(如果您愿意,可以更改它,但我不会)。我只是实例化 myJob = new MyJob()在您的 setUp并调用 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
}

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

关于Grails Quartz 作业集成测试 - 不是 Autowiring 的作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10433333/

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