Проверка Mockito scala не работает с scalatestplus-play

#scala #playframework #mockito #scalatest

#scala #playframework #mockito #scalatest

Вопрос:

Итак, у меня есть проект Play 2.5 с использованием scala, и у меня есть эти зависимости от моего build.sbt:

 "org.scalatestplus.play" %% "scalatestplus-play" % "1.5.1" % Test
"org.mockito" % "mockito-all" % "1.10.19" % Test
  

И мой тест выглядит так:

 import java.util.UUID
import org.mockito.Mockito._
import org.scalatest.BeforeAndAfter
import org.scalatest.mock.MockitoSugar
import org.scalatestplus.play.{OneAppPerSuite, PlaySpec}
import play.api.mvc.{AnyContentAsEmpty, Result}
import play.api.test.{FakeRequest, Helpers}
import play.api.test.Helpers._
import services.TargetServiceImpl

import scala.concurrent.Future

class MyControllerTest extends PlaySpec with MockitoSugar with BeforeAndAfter with OneAppPerSuite {
  val targetService = mock[TargetServiceImpl]
  var subject = new TargetAjaxController(targetService)

  "TargetAjaxController" should {

    "use the mocked service to delete a target" in {
      val oauthToken = UUID.randomUUID().toString
      val targetId = Random.nextLong()
      val result: Future[Result] = subject.delete(targetId).apply(fakeRequestWithSession(oauthToken))

      verify(targetService).deleteTarget(targetId, oauthToken)

      status(result) mustBe OK
      contentType(result) mustBe Some("application/json")
    }

  }

  private def fakeRequestWithSession(oauthToken: String): FakeRequest[AnyContentAsEmpty.type] = {
    FakeRequest(Helpers.DELETE, "/targets")
      .withSession(
        ("token", oauthToken)
      )
  }

}
  

Когда я запускаю этот тест, я получаю сообщение об ошибке, в котором говорится:

 org.mockito.exceptions.verification.WantedButNotInvoked: Wanted but not invoked (...) Actually, there were zero interactions with this mock
  

Но когда я помещаю некоторые println внутри targetService#deleteTarget , я вижу, что в консоли напечатано, что код был фактически выполнен, как ожидалось, и макет был вызван, Mockito просто не записал использование макета.

Самое странное, что это отлично работает на компьютерах разработчиков, ошибка возникает только при запуске в Jenkins.

Я делаю что-то не так здесь? Есть идеи, почему verify вызов не будет работать?

Большое спасибо!

Ответ №1:

используйте ожидание перед subject.delete. У UnitSpec есть этот метод. Проверьте, доступно ли это в вашей спецификации.