【问题标题】:Play/Scala injecting Object into controller for testingPlay/Scala 将对象注入控制器进行测试
【发布时间】:2016-12-23 18:12:19
【问题描述】:

我看到这个帖子Play/Scala injecting controller into test 我也有类似的问题,但我的问题是如何注入对象来测试控制器。

控制器

@Singleton
class ExampleCtrl @Inject() (dao: TestDAO) extends Controller {
//code here
   def testMethod = Action { request =>
       dao.exampleMethod()
       Ok(Json.obj("test" -> "test")
   }
 }

DAO

class TestDAO @Inject()(protected val provider: DatabaseConfigProvider){
  def exampleMethod()
}

测试

class ExampleCtrlSpec extends PlaySpec with MockitoSugar {
  val service = mock[TestDAO]//problem on injecting DatabaseConfigProvider
  val controller = new ExampleCtrl(service)
  //service has null value for DatabaseConfigProvider properties

  "testMethod()" should {
    "return JSON" in {
      when(service.exampleMethod) thenReturn "json data"
      val result: Future[Result] =
      controller.testMethod().apply(FakeRequest())
      .withJsonBody(JSON.json("""[{"test":"test"}]"""))
      contentAsString(result) mustEqual """[{"test":"test"}]"""
    }
  }
}

【问题讨论】:

    标签: scala playframework-2.0 scalatest


    【解决方案1】:

    所以我尝试重现该问题,但在修复了 IDE 用代码识别的一些问题(例如缺少括号)后,测试通过了。

    注入DatabaseConfigProvider的问题

    我在这里没有看到任何问题,因为代码正在通过。从编码人员的角度来看,mock[TestDAO] 实际上并没有实例化一个真正的TestDAO,但它创建的东西看起来像一个(接口方面),但实际上并不包含您在@987654323 中编写的任何逻辑@。因此,模拟对象也不需要注入DatabaseConfigProvider

    服务的 DatabaseConfigProvider 属性值为空

    因为服务(您的模拟 TestDAO)是模拟的,所以这不是问题,因为没有逻辑会使用它。您的模拟实际执行的唯一逻辑在这里:

    when(service.exampleMethod) thenReturn "json data"
    

    使用模拟时,您需要编写您希望它们在测试中表现出的行为,就像您在上面的 sn-p 中所做的那样。

    如果您想运行任何DatabaseConfigProvider 方法,也许您需要:

    • 直接创建一个(例如val myProvider = [new] DatabaseConfigProvider(...)),
    • 将模拟移出一层,这样您就有了一个真正的控制器、一个真正的TestDAO 和一个模拟DatabaseConfigProvider(类似于val controller = new ExampleCtrl(new TestDAO(mock[DatabaseConfigProvider]))),或者
    • 一起编写不同类型的测试。

    【讨论】:

      【解决方案2】:

      我通过以下方式解决了问题。

      def testDAO (implicit app: Application) = {
          val app2testDAO = Application.instanceCache[TestDAO ]
          app2testDAO(app)
      }
      val controller = new ExampleCtrl(testDAO)
      

      【讨论】:

        猜你喜欢
        • 2016-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-14
        • 1970-01-01
        • 2014-04-12
        • 2020-08-27
        相关资源
        最近更新 更多