播放2.6.20对控制器的依赖注入在测试用例中不起作用

时间:2019-02-20 14:10:55

标签: scala playframework

我具有Service特质,其实现称为ServiceImpl

服务

trait Service {
  def input(input: JsValue): Unit
}

ServiceImpl

@Named("scoring")
class ServiceImpl extends Service {

  override def input(input: JsValue): Unit = {
    println(input.toString())
  }
}

这是我设置播放模块的方式:

class Module extends AbstractModule {
  override def configure(): Unit =  {
    bind(classOf[Service])
      .annotatedWith(Names.named("myservice"))
      .to(classOf[ServiceImpl])
  }
}

这就是我设置控制器的方式

@Singleton
class MyController @Inject()(cc: ControllerComponents, ss: Service)
  extends AbstractController(cc) {

  def score = Action { request =>
    val body: Option[JsValue] = request.body.asJson
    if (body.isEmpty) {
      BadRequest(Json.obj("status" -> "KO"))
    } else {
      System.out.println(body.get.toString())
      //      ss.input(body.get)
      Ok(Json.obj("status" -> "OK", "message" -> "some score"))
    }
  }
}

请注意,我已注释掉在服务中调用方法的行。

这里是对功能的测试。

  "MyController#score" must {
    "process JSON payload to be scored by the engine" in {
      val myservice = app.injector.instanceOf[Service]

     // I have also tried to inject the controller and it doesn't work.

     // val mycontroller = app.inject.instanceOf[MyController]

      val mycontroller = new MyController(stubControllerComponents(), myservice)
      val scoringResult: Future[Result] = mycontroller.score().apply(FakeRequest().withJsonBody(getTestInput))
      val statusCode = status(scoringResult)
      statusCode mustBe 200
    }

运行此测试时,我没有任何有关失败原因的信息。像为什么为什么在测试中不播放日志输出?我不知道测试有什么问题。我只知道测试失败。

当我从控制器中删除服务参数时,测试通过。所以我显然对DI做错了。

我什至尝试使用play.modules.enabled配置,但仍然没有任何内容。

0 个答案:

没有答案