我有一个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
使用模拟的类?
答案 0 :(得分:0)
能够模拟内部使用的对象的典型模式是注入,或者至少提供一种注入备用对象的方式。
由于Utilities
是一个对象,因此无法使用构造函数进行注入。您仍然可以引入setter方法。
如果您不希望使用setter进行单元测试以外的任何其他操作,请将其设置为package-private,并且还可以在名称前加上“ qa”:
private[utils] def qaSetHelperMethods(qaHelper: HelperMethods): Unit