我有一个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