Делаем кварцевые работы тестируемыми - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть какой-то старый код, который должен позволять нам сначала планировать задачи Quartz (которые сохраняют базу данных), а затем выполнять Quartz. Проблема в том, что код задания выглядит примерно так:

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

Я пытался реорганизовать наш код, чтобы сделать его более дружественным к инверсии управления, поэтому я хотел бы сделать ServiceA и ServiceB не-одиночки. Но я не вижу, как ... Quartz Job должен иметь конструктор 0-args, поэтому я не могу передать свои зависимости таким образом (что было бы идеально).

Любой обходной путь, о котором я не знаю? Я хотел бы избежать Io C фреймворков, я вполне доволен передачей своих параметров в качестве имплицитов в Scala.

Спасибо

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

В случае, если вы не можете передать служебные зависимости через конструктор, вероятно, может помочь извлечение базовой реализации без зависимостей - но это выглядит немного странно:

  // 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()
  }

Надеюсь, это поможет!

0 голосов
/ 03 февраля 2020

Конечно, вы можете передать их через конструктор. Просто есть два конструктора:

    class MyJob(serviceA: Foo, serviceB: Bar) extends Job {
       def this() = this(ServiceA, ServiceB)
       def execute(context: JobExecutionContext) = {
          serviceA.foo()
          serviceB.bar()
       }
     }

     val testMe = new MyJob(mock[Foo], mock[Bar])
...