Mockito возвращает нулевое значение для Future - PullRequest
0 голосов
/ 05 марта 2019

Я тестирую модуль controller в приложении play-framework.

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) вызывает метод 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)

Что я могу делать не так?

1 Ответ

0 голосов
/ 05 марта 2019

Проблема, по-видимому, заключалась в том, что я неправильно использовал when.Я читал, что "Mockito позволяет конфигурировать возвращаемые значения его макетов через свободный API. Неуказанные вызовы методов возвращают" пустые "значения:

null для объектов

0 для чисел

false для логического значения

пустые коллекции для коллекций

Моды могут возвращать разные значения в зависимости от аргументов, переданных в метод. Цепочка методов when (….). ThenReturn (….)используется для указания возвращаемого значения для вызова метода с предопределенными параметрами. "

when ожидает метод, а также точные аргументы.Поэтому, если я хочу позвонить findUser(userkey), где значение userkey скажет 1 в реальном вызове, тогда мне нужно написать when(findUser(1)) или userKey=1; findUser(userKey)).

В моей неправильной реализации я установил userkey как

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

но вызов findUser был со значением

UserKeys (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)))
...