Макет моего класса не называют - PullRequest
1 голос
/ 10 марта 2019

У меня есть HelperMethod класс.

class HelperMethods {
    def getUniqueID(): UUID = {
        UUID.randomUUID()
    }

    def bucketIDFromEmail(email:String): Int =  {

        val bucketID= email(0).toInt
        println("returning id "+bucketID+" for name "+email)
        bucketID
   }
}

И object, который имеет экземпляр HelperMethods

package object utilities{
    private val helper = new HelperMethods()
    def getUniqueID(): UUID = helper.getUniqueID()
    def bucketIDFromEmail(email:String): Int = helper.bucketIDFromEmail(email)  
}

Я написал спецификацию, чтобы проверить, что мой макет работает правильно.

class UserControllerUnitSpec extends PlaySpec {

val mockHelperMethods = mock(classOf[HelperMethods])

  when(mockHelperMethods.getUniqueID()).thenReturn(UUID.fromString("87ea52b7-0a70-438f-81ff-b69ab9e57210"))
  when(mockHelperMethods.bucketIDFromEmail(ArgumentMatchers.any[String])).thenReturn(1)

  "mocking helper class " should {
    "work" in {
      val bucketId = utilities.bucketIDFromEmail("t@t.com")
      println("user keys are " + userKeys)

      val id: UUID = utilities.getUniqueID()
      println("got id " + userKeys)

      bucketId mustBe 1
      id mustBe UUID.fromString("87ea52b7-0a70-438f-81ff-b69ab9e57210")

    }
  }
}

тест не пройден по причине 116 was not equal to 1.Это соответствует строке bucketId mustBe 1 в спецификации.Я могу видеть печать returning id 116 for name t@t.com.Я не должен видеть это, поскольку я пытаюсь издеваться над этим классом.Я подозреваю, что это может быть потому, что объект utilities создается перед оператором val mockHelperMethods = mock(classOf[HelperMethods]) в спецификации.

Вопрос 2 - Есть ли способ высмеять HelperMethods и заставить utilities использоватьвысмеянный класс?

Ответы [ 2 ]

1 голос
/ 10 марта 2019

Вы высмеяли HelperMethods, но не utilities.

Вопрос 2. Есть ли способ смоделировать HelperMethods и заставить утилиты использовать смоделированный класс?

Нельзя издеваться над object.

Если вы хотите, вы должны извлечь поведение в trait.

Вот решение, которое будет работать:

package utils

// move the behavior to a trait:
trait UtitilitiesTrait {
  private[utils] def helper = new HelperMethods()

  def getUniqueID(): UUID = helper.getUniqueID()

  def bucketIDFromEmail(email: String): Int = helper.bucketIDFromEmail(email)
}

// provide an object for real use
object Utilities extends UtitilitiesTrait

// override helper for test mock
object TestUtilities extends UtitilitiesTrait {
  private[utils] override def helper = mock(classOf[HelperMethods])
}

А вот ваш тест:

class UserControllerUnitSpec extends PlaySpec {

   val mockHelperMethods = mock(classOf[HelperMethods])
   object TestUtilities extends UtitilitiesTrait {
     private[utils] override def helper = mockHelperMethods
   }   
   when(mockHelperMethods.getUniqueID()).thenReturn(UUID.fromString("87ea52b7-0a70-438f-81ff-b69ab9e57210"))
      when(mockHelperMethods.bucketIDFromEmail(ArgumentMatchers.any[String])).thenReturn(1)

  "mocking helper class " should {
    "work" in {
      val bucketId = TestUtilities.bucketIDFromEmail("t@t.com")
      println("user keys are " + userKeys)

      val id: UUID = TestUtilities.getUniqueID()
      println("got id " + userKeys)

      bucketId mustBe 1
      id mustBe UUID.fromString("87ea52b7-0a70-438f-81ff-b69ab9e57210")

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

Типичным шаблоном, который позволяет использовать для имитации объекты, используемые внутри, является внедрение их или, по крайней мере, предоставление способа добавить альтернативу.

Поскольку Utilities является объектом, вы можетене вводить с помощью конструктора.Вы все еще можете ввести метод установки.

Если вы не хотите использовать метод установки для чего-либо, кроме модульных тестов, сделайте его закрытым для пакета, и вы также можете добавить к имени префикс «qa»:

private[utils] def qaSetHelperMethods(qaHelper: HelperMethods): Unit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...