使用Guice测试控制器时,模拟服务类无法正常工作

时间:2016-01-15 20:43:21

标签: scala unit-testing playframework mockito guice

我有一个使用依赖注入的控制器,目前看起来像这样:

class FormFieldValues @Inject() (ffValuesRepo : FormFieldValueRepository) extends Controller with ClassLogger {

    /**
      * Gets all FormFieldValue obejct for Checllist revision ID
      *
      * @param revId
      * @return
      */
    def getAll(revId: Muid) = Action { implicit request =>
        DB.withTransaction { implicit connection =>
            logger.info("INJECTED REPO: " + ffValuesRepo)

            val values = ffValuesRepo.getAllForChecklistRevision(revId)

            logger.info("VALUES: " + values)
            // Forse it to json
            Ok(Json.toJson(values)).as("application/json")
        }
    }
}

控制器的实际执行按预期工作。 但是,当我尝试使用模拟存储库构建测试时,模拟似乎没有正确使用。

这是我目前的测试:

class FormFieldValuesSpec extends Specification with Mockito{

    lazy val mockffValueRepo = mock[FormFieldValueRepository]
    implicit val connection = mock[Connection]

    val mockedServicesApp = new GuiceApplicationBuilder()
        .overrides(bind[FormFieldValueRepository].toInstance(mockffValueRepo))
        .build()

    "FormFieldValues#getAll" should {
        "return a json object with all relevant list of field values for checklist revision ID" in new WithApplication(mockedServicesApp) {
            // Lets try an empty list first
            val emptyList = List()

            doReturn(emptyList).when(mockffValueRepo).getAllForChecklistRevision(Muid.fromString("r5R3m4MWQZVaKjCSikFJfg").get)

            val Some(result) = route(FakeRequest(GET, "/1/checklist-revisions/r5R3m4MWQZVaKjCSikFJfg/form-field-values"))

            status(result) must equalTo(OK)
        }
    }
}

在日志中我看到了:

  

2016-01-15 20:34:50,450 INFO c.w.FormFieldValues - INJECTED REPO:   模拟FormFieldValueRepository,hashCode:1337346192 2016-01-15   20:34:50,463 INFO c.w.FormFieldValues - VALUES:null

这意味着对象被正确注入,但由于某种原因而不是按照我的存根(空List)返回,它只是总是返回null。

更新 经过一些挖掘后,我通过用spy替换mock来实现它:

val mockffValueRepo = spy(new AnormFormFieldValueRepository())
implicit val connection = mock[Connection]

所以看起来模拟本身根本不起作用...... 我怎样才能让它与正确的模拟一起工作?

我做错了什么?

谢谢,

0 个答案:

没有答案