我班上的模拟课没有被召唤

时间:2019-03-10 15:15:42

标签: scala mockito

我有一个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使用模拟的类?

1 个答案:

答案 0 :(得分:0)

能够模拟内部使用的对象的典型模式是注入,或者至少提供一种注入备用对象的方式。

由于Utilities是一个对象,因此无法使用构造函数进行注入。您仍然可以引入setter方法。

如果您不希望使用setter进行单元测试以外的任何其他操作,请将其设置为package-private,并且还可以在名称前加上“ qa”:

private[utils] def qaSetHelperMethods(qaHelper: HelperMethods): Unit