我具有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
配置,但仍然没有任何内容。