我有一个测试,它正在测试一个需要隐式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类中注入我的自定义执行上下文的模拟实例作为隐式参数吗?
答案 0 :(得分: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
}
}
}