我有一个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实例的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使用模拟的类吗?
发布于 2019-03-10 15:54:35
你嘲笑过HelperMethods,但没有嘲笑utilities。
问题2-是否有一种方法来模拟HelperMethods并使实用程序使用模拟类?
不可能模拟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")
}
}
}发布于 2019-03-10 17:13:32
启用内部使用的模拟对象的典型模式是注入它们,或者至少提供一种注入备用对象的方法。
因为Utilities是一个对象,所以不能使用构造函数进行注入。您仍然可以引入setter方法。
如果您希望阻止在单元测试以外的任何情况下使用setter,请将其设置为包-私有,还可以在名称前加上"qa":
private[utils] def qaSetHelperMethods(qaHelper: HelperMethods): Unithttps://stackoverflow.com/questions/55089128
复制相似问题