#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 вы используете.