Scala - Play - Как имитировать импорт play.api.libs.concurrent.CustomExecutionContext в Test и использовать его как неявный параметр?

У меня есть тест, который тестирует класс, который ожидает неявный CustomExecutionContext:

@Singleton
class MyRepo @Inject()
(appConfigService: AppConfigService)
(implicit ec: RepositoryDispatcherContext)

Теперь мне нужно протестировать этот класс и ввести контекст фиктивного диспетчера во время теста. Первоначально я думал об использовании стандартного глобального контекста выполнения, который поставляется из коробки.

implicit executionContext = scala.concurrent.ExecutionContext.Implicits.global

Но тест терпит неудачу, ожидает другой тип экземпляра:

не удалось найти неявное значение для параметра ec: common.executor.RepositoryDispatcherContext

Это мой пользовательский контекст выполнения:

import javax.inject.{Inject}
import akka.actor.ActorSystem
import play.api.libs.concurrent.CustomExecutionContext

class RepositoryDispatcherContext @Inject()(actorSystem: ActorSystem) extends CustomExecutionContext(actorSystem, "repository.dispatcher")

Интересно, как внедрить фиктивный экземпляр моего пользовательского контекста выполнения, чтобы он использовался в качестве неявного параметра в моем классе Test?

1 ответ

Решение

Вы можете создать подкласс своего пользовательского диспетчера и переопределить необходимые методы:

import org.specs2.mutable.Specification

import akka.actor.ActorSystem
import scala.concurrent.ExecutionContext

class MySomethingSpec extends Specification with Mockito {

  "MySomething" should {    

    "mock repository dispatcher itself" in {
      class MyMockedRepositoryDispatcher(executionContext: ExecutionContext) extends RepositoryDispatcherContext(ActorSystem()) {
        override def execute(command: Runnable) = executionContext.execute(command)
        override def reportFailure(cause: Throwable) = executionContext.reportFailure(cause)
      }

      val executionContext: ExecutionContext = ??? // whatever you need
      val repositoryDispatcher: RepositoryDispatcherContext = new MyMockedRepositoryDispatcher(executionContext)

      // do what you need
      // assertions
    }
  }
}
Другие вопросы по тегам