Как проверить введенный класс через Spec2?

Я пытаюсь проверить класс

@Singleton
class Foo @Inject()(bar: Bar)(implicit ec: ExecutionContext) {
  def doSomething = bar.doSomethingInBar
}

class Bar {
  def doSomethingInBar = true
}

через Specification класс, который упоминается ниже

class FooTest @Inject()(foo: Foo) extends Specification {
  "foo" should {
    "bar" in {
      foo.doSomething mustEqual (true)
    }
  }
}

Теперь, когда я запускаю это, я получаю следующую ошибку

Can't find a constructor for class Foo

Я следовал за решением, упомянутым здесь

И определил Injector

object Inject {
  lazy val injector = Guice.createInjector()

  def apply[T <: AnyRef](implicit m: ClassTag[T]): T =
    injector.getInstance(m.runtimeClass).asInstanceOf[T]
}

и lazy val foo: Foo = Inject[Foo] внутри моего класса спецификации. Это решает мою проблему инициализации конструктора, но сейчас я получаю эту ошибку.

[error]   ! check the calculate assets function
[error]    Guice configuration errors:
[error]    
[error]    1) No implementation for scala.concurrent.ExecutionContext was bound.
[error]      while locating scala.concurrent.ExecutionContext

1 ответ

Решение

Вы должны предоставить неявное ExecutionEnv заставить код работать

@RunWith(classOf[JUnitRunner])
class FooTest(implicit ee: ExecutionEnv)  extends Specification {
  "foo" should {
    "bar" in {
      foo.doSomething mustEqual (true)
    }
  }
}

Теперь где-то в вашем коде вам нужно инициализировать конструкцию foo, и вы можете передать ее через конструктор - что является точкой внедрения зависимости.

Другие вопросы по тегам