как сопоставить Some с любым значением в mockito

#scala #mockito

#scala #mockito

Вопрос:

Моя тестируемая функция возвращает None или Some(ObjectOfSignupEmail) . В моем тестовом примере я хочу сопоставить возвращаемое значение с Some(ArgumentMatchers.any[SignupEmail]) , но я получаю ошибку

 Expected :Some(null)
Actual   :Some(SignupEmail(Welcome,Test<mailrobot@test.com>,<a href=https://localhost:9000/test/ws/users/signup/11111111-1111-1111-1111-111111111111>Click here to verify email</a>))
  

Если я изменю код на, signupEmailOption mustBe Some(expectedAnswer) где expectedAnswer находится экземпляр SignupEmail , тогда тест пройдет.

Почему ArgumentMatchers.any не сработало внутри Some ?

Это не работает

 "createEmailMessageForUserToken for all correct parameters" should {
    "return Some(email)" in {

      val mailConfig = Map("signupUrl"-> "/test/ws/users/signup/",
        "signupFrom"->"Test<mailrobot@test.com>",
        "signupReply"->"Test<noreply@test.com>",
        "signupSubject"->"Welcome")
      val mailerConfig = Map(
        "host" -> "localhost", // (mandatory). The domain of mail server i.e. the server is responsible for sending/receiving emails for this domain
        "port" -> "9000",
        "tlsRequired" -> "yes"
      )
      val newConfig = Map("mail"->mailConfig,
        "play.mailer"->mailerConfig)
      val newConfiguration = Configuration.from(newConfig)
      val testEnv = new TestEnv(newConfiguration)

      val signupEmailOption:Option[SignupEmail] = testEnv.controller.createEmailMessageForUserToken(testEnv.userToken)

       signupEmailOption mustBe Some(ArgumentMatchers.any(SignupEmail.getClass()))
    }


  }
  

Это работает

  "createEmailMessageForUserToken for all correct parameters" should {
    "return Some(email)" in {

      val mailConfig = Map("signupUrl"-> "/test/ws/users/signup/",
        "signupFrom"->"Test<mailrobot@test.com>",
        "signupReply"->"Test<noreply@test.com>",
        "signupSubject"->"Welcome")
      val mailerConfig = Map(
        "host" -> "localhost", // (mandatory). The domain of mail server i.e. the server is responsible for sending/receiving emails for this domain
        "port" -> "9000",
        "tlsRequired" -> "yes"
      )
      val newConfig = Map("mail"->mailConfig,
        "play.mailer"->mailerConfig)
      val newConfiguration = Configuration.from(newConfig)
      val testEnv = new TestEnv(newConfiguration)

      val url = "https://"   mailerConfig("host")   ":"   mailerConfig("port")   mailConfig("signupUrl")   testEnv.userToken.tokenId
      val html =s"<a href=${url}>Click here to verify email</a>"
      //println("html is " html)
      val expectedAnswer = SignupEmail(mailConfig("signupSubject"),mailConfig("signupFrom"),html)
      println("expected answer would be " expectedAnswer)

      val signupEmailOption:Option[SignupEmail] = testEnv.controller.createEmailMessageForUserToken(testEnv.userToken)
      signupEmailOption mustBe Some(expectedAnswer)

 //          signupEmailOption mustBe Some(ArgumentMatchers.any(SignupEmail.getClass()))
    }


  }
  

Комментарии:

1. Попробуйте это: Some(ArgumentMatchers.any(SignupEmail.getClass))

2. не сработало. Я полагаю, any[SignupEmail] это то же самое, что и предложенный вами вариант.

3. Можете ли вы вставить весь код целиком?

4. обновлен вопрос

5. Спасибо, это mustBe метод из mockito?

Ответ №1:

Вы должны использовать Scalatest средства сопоставления вместо Mockito matchers для того, что вы хотите сделать

Вы смешиваете концепции, средства сопоставления mockito предназначены для использования в аргументах заглушенных методов mock, если вы хотите подтвердить результат вызова вашего тестового объекта, вы должны использовать средства сопоставления, предоставляемые вашей тестовой средой (Scalatest в вашем случае, насколько я вижу), поэтому в основном проверьте документы и на mustBe этой Options странице.

Подсказка: если вы хотите проверить тип того, что находится внутри option , вы можете использовать средство сопоставления частичных функций и написать что-то вроде

 signupEmailOption should matchPattern { case Some(_: SignupEmail) => }
  

Ответ №2:

Несколько вариантов.

 signupEmailOption should not be None

signupEmailOption should not be empty

signupEmailOption shouldBe defined

signupEmailOption should matchPattern { case Some(_) => }

inside(signupEmailOption) { case Some(_) => }
  

Все они эквивалентны.

Но то, что вы делаете — signupEmailOption shouldBe Some(expectedAnswer) на самом деле лучший вариант из всех. Это правильная вещь, которую нужно сделать здесь. Просто оставьте это в таком виде.

Примечание: утверждения should* и must* практически одно и то же, они просто зависят от того, какую черту DSL вы используете.