我班的模拟没有被叫

  • 本文关键字:模拟 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
   }
}

和一个具有HelperMethods实例的object

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使用模拟类?

您已经模拟了HelperMethods,但没有utilities

问题2-有没有一种方法可以模拟助手手机并使实用程序使用模拟的类?

不可能模拟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")
    }
  }
}

启用内部使用模拟对象的典型模式是注射 它们,或者至少提供了一种注入替代的方法。

由于Utilities是一个对象,因此您无法使用构造函数注入。您仍然可以介绍一个设置器方法。

如果您想劝阻除设备测试以外的任何其他设置器,请进行包装私有化,并且您也可能以" QA"为前缀:

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

相关内容

  • 没有找到相关文章

最新更新