我是斯卡拉的新人。目前,我正在进行一项模拟特性测试。有人能帮我实现吗?我想模拟特性seasonalityDao.doSomeForB和测试方法hMock.doSomeForF()中的方法SeasonalityServiceImpl和hMock.doSomeForF()。
更新:我已经根据下面的评论更正了代码。在本例中,当我试图对模拟的方法验证(SMock)、.doSomeForB()验证(SMock).doSomeForB1()进行验证时,我会收到下一个错误: seasonalityDao.doSomeForB();->在主$anonfun$1中使用$mcV$sp(Main.scala:12)--实际上,与这个模拟没有任何交互。
下面是一个代码(我刚刚简化了项目的重要部分,举个例子):
import org.scalatest._
import org.mockito.Mockito._
class Main extends FunSuite with SeasonalityServiceComponentImpl with SeasonalityDaoComponent {
test("some test") {
def hMock = mock(classOf[SeasonalityServiceImpl])
def sMock = mock(classOf[SeasonalityDao])
when(sMock.doSomeForB()).thenReturn(Option(2))
when(sMock.doSomeForB1()).thenReturn(10)
verify(sMock).doSomeForB()
verify(sMock).doSomeForB1()
println("With Option " + hMock.doSomeForF())
println("Without Option " + hMock.doSomeForF1())
}
override def seasonalityDao: SeasonalityDao = mock(classOf[SeasonalityDao])
override def seasonalityService: SeasonalityService = mock(classOf[SeasonalityService])
}
trait SeasonalityDaoComponent {
def seasonalityDao: SeasonalityDao
trait SeasonalityDao {
def doSomeForB(): Option[Int]
def doSomeForB1(): Int
}
}
trait SeasonalityServiceComponent {
def seasonalityService: SeasonalityService
trait SeasonalityService {
def doSomeForF(): Option[Int]
def doSomeForF1(): Int
}
}
trait SeasonalityServiceComponentImpl extends SeasonalityServiceComponent {
this: SeasonalityDaoComponent =>
trait SeasonalityServiceImpl extends SeasonalityService {
def doSomeForF(): Option[Int] = {
seasonalityDao.doSomeForB()
}
def doSomeForF1(): Int = {
seasonalityDao.doSomeForB1()
}
}
}发布于 2014-07-04 10:28:23
如果我正确理解,您希望在模拟中调用doSomeForB和doSomeForB1。但是您的代码在调用它们之前验证了这个期望,所以测试失败了。
此外,模拟被定义为本地方法,这意味着每次调用时都会得到一个新的模拟对象。您需要将它们转换为本地值,这样就可以交互(并验证)相同的实例。
修改为如下所示:
test("some test") {
// this seems unused -->> def hMock = mock(classOf[SeasonalityServiceImpl])
val sMock = mock(classOf[SeasonalityDao]) // you need it to be a val, not a def
when(sMock.doSomeForB()).thenReturn(Option(2))
when(sMock.doSomeForB1()).thenReturn(10)
println("With Option " + sMock.doSomeForF()) // note that you should call them on sMock
println("Without Option " + sMock.doSomeForF1())
verify(sMock).doSomeForB()
verify(sMock).doSomeForB1()
}https://stackoverflow.com/questions/24557046
复制相似问题