gpt4 book ai didi

java - 使 Quartz 作业可进行单元测试

转载 作者:行者123 更新时间:2023-12-02 09:02:47 25 4
gpt4 key购买 nike

我有一些旧代码,应该允许我们首先安排 Quartz 任务(使数据库持久化),然后由 Quartz 执行。问题是作业代码看起来像这样:

class MyJob extends Job {
def execute(context: JobExecutionContext) {
ServiceA.m() <-- Singleton call
...
ServiceB.n() <-- Singleton call
}
}

我试图重构我们的代码,使其对控制反转更加友好,因此我希望使 ServiceAServiceB 成为非单例。但我不明白如何...... Quartz Job 需要有一个 0-args 构造函数,所以我无法以这种方式传递我的依赖项(这本来是理想的)。

有什么我不知道的解决方法吗?我想避免使用 IoC 框架,我对在 Scala 中隐式传递参数感到非常满意。

谢谢

最佳答案

如果您无法通过构造函数传递服务依赖项,则提取没有依赖项的基本实现可能会有所帮助 - 但这看起来有点样板:

  // Base implementation without direct service instantiation 
trait BaseMyJob extends Job {
protected val serviceA: ServiceA
protected val serviceB: ServiceB

def execute(context: JobExecutionContext) {
serviceA.m()
...
serviceB.n()
}
}

// Used in your production code via Quartz
class ProductionMyJob extends BaseMyJob {
override protected val serviceA: ServiceA = ServiceA()
override protected val serviceB: ServiceB = ServiceB()
}

// Somewhere in your test spec
val mockServiceA = mock[ServiceA]
val mockServiceB = mock[ServiceB]

val testJob: BaseMyJob = class TestMyJob extends BaseMyJob {
override protected val serviceA: ServiceA = ServiceA()
override protected val serviceB: ServiceB = ServiceB()
}

希望这有帮助!

关于java - 使 Quartz 作业可进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60039395/

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