首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们班的嘲笑是没有人打电话来的

我们班的嘲笑是没有人打电话来的
EN

Stack Overflow用户
提问于 2019-03-10 15:15:41
回答 2查看 60关注 0票数 1

我有一个HelperMethod课程。

代码语言:javascript
复制
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实例的HelperMethods

代码语言:javascript
复制
package object utilities{
    private val helper = new HelperMethods()
    def getUniqueID(): UUID = helper.getUniqueID()
    def bucketIDFromEmail(email:String): Int = helper.bucketIDFromEmail(email)  
}

我编写了一个规范来测试我的模拟是否正确工作。

代码语言:javascript
复制
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使用模拟的类吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-10 15:54:35

你嘲笑过HelperMethods,但没有嘲笑utilities

问题2-是否有一种方法来模拟HelperMethods并使实用程序使用模拟类?

不可能模拟object

如果需要,您必须提取trait中的行为。

以下是一个可行的解决方案:

代码语言:javascript
复制
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])
}

这是你的测试:

代码语言:javascript
复制
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")

    }
  }
}
票数 1
EN

Stack Overflow用户

发布于 2019-03-10 17:13:32

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

因为Utilities是一个对象,所以不能使用构造函数进行注入。您仍然可以引入setter方法。

如果您希望阻止在单元测试以外的任何情况下使用setter,请将其设置为包-私有,还可以在名称前加上"qa":

代码语言:javascript
复制
private[utils] def qaSetHelperMethods(qaHelper: HelperMethods): Unit
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55089128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档