我有一个使用依赖注入的控制器,目前看起来像这样:
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]
所以看起来模拟本身根本不起作用...... 我怎样才能让它与正确的模拟一起工作?
我做错了什么?
谢谢,