【问题标题】:Mockito returning null value for FutureMockito 为 Future 返回空值
【发布时间】:2019-03-05 05:56:58
【问题描述】:

我正在play-framework 应用程序中对controller 进行单元测试。

controller 使用存储库,我正在模拟存储库,如下所示

val mockUserRepository = mock(classOf[UsersRepository])
  when(mockUserRepository.findOne(userKeys)).thenReturn(Future{Some(user)})
  when(mockUserRepository.save(user)).thenReturn(Future(Some(user)))

然后我运行以下测试。测试中controller.signupUser(request)调用repository的findOne方法如下

val findUserFuture: Future[Option[User]] = userRepo.findOne(userKeys) 

        println("user future is ",findUserFuture)
        findUserFuture.flatMap { (userOption: Option[User]) => //this crashes because findUserFuture is null)

但是findOne 返回一个null 而不是一个虚拟的Future{user}

"User signup request with body" should {
    "return OK and user profile if the signup profile data is correct" in {


      val jsonBody = Json.parse(
        """
          {
             "external-profile":{
                "email":"test@test.com",
                "firstname":"fn",
                "lastname":"ln",
                "password":"aA1!1111"
             }
          }
        """)
      //val jsonBody = Json.toJson(signupInfo)
      val request: Request[AnyContentAsJson] = FakeRequest("POST", "ws/users/signup",Headers(("someH"->"someV")),new AnyContentAsJson(jsonBody))
      println("sending sign up request ", request)
      //request.body = signupInfo
      val response: Future[Result] = controller.signupUser(request)
      val responseBodyAsJsValue:JsValue = contentAsJson(response)
      println("received response of sign up ", responseBodyAsJsValue)

    }
  }

错误 收到个人资料

UserProfile(None,ExternalUserProfile(test@test.com,fn,ln,Some(aA1!1111)))
checking if the user with the following details exists LoginInfo(credentials,test@test.com)
returning id 116 for name test@test.com
(user future is ,null)

java.lang.NullPointerException was thrown.
java.lang.NullPointerException
    at controllers.UserController.$anonfun$signupUser$1(UserController.scala:116)

我可能做错了什么?

【问题讨论】:

    标签: mockito playframework-2.6


    【解决方案1】:

    问题显然是我没有正确使用when。 我读到“ Mockito 允许通过流畅的 API 配置其模拟的返回值。未指定的方法调用返回“空”值:

    对象为空

    0 表示数字

    布尔为false

    集合的空集合

    Mocks 可以根据传递给方法的参数返回不同的值。 when(…​.).thenReturn(…​.) 方法链用于为具有预定义参数的方法调用指定返回值。 "

    when 需要方法以及确切的参数。因此,如果我想调用findUser(userkey),其中userkey 的值在实际调用中是1,那么我需要写when(findUser(1))userKey=1; findUser(userKey))

    在我的错误实现中,我将userkey 设置为

    UserKeys(1,"test@test.com",loginInfo,"","")

    但是对findUser 的调用是有价值的

    用户密钥(116,"d@d.com",loginInfo,"fn","ln")

    我在测试中更改了 userkey 值,它起作用了

    val userKeys = UserKeys(utilities.bucketIDFromEmail(email)/*returns 116*/,"d@d.com",loginInfo,"fn","ln")
    
          when(mockUserRepository.findOne(userKeys)).thenReturn(Future{Some(user)})
          when(mockUserRepository.save(user)).thenReturn(Future(Some(user)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多