2014-07-03 27 views
0

我是斯卡拉新手。目前我正在尋求對特徵進行模擬測試。有人能幫我實施嗎?我想模擬季節性SeasonalityServiceImpl和測試方法hMock.doSomeForF()中的方法seasonalityDao.doSomeForB和seasonalityDao.doSomeForB1。Mockito的斯卡拉測試特徵

更新: 我已根據下面的註釋更正了代碼。 (sMock).doSomeForB()驗證(sMock).doSomeForB1(),我收到下一個錯誤: 通緝但未調用: seasonalityDao.doSomeForB(); - > at Main $$ anonfun $ 1.apply $ 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() 
    } 
    } 
} 
+0

到底是什麼問題? –

+0

如何正確實現SeasonalityServiceImpl的模擬測試?在這種情況下,我收到消息:不能嘲笑/間諜類主要$$不久$ 1 的Mockito不能嘲笑以下/間諜: - final類 - 匿名類 - 基本類型 org.mockito.exceptions.base.MockitoException :. .. – Nikolay

+1

您應該編輯問題並添加這些錯誤。人們會更有可能回答。 至於問題本身,請使用'classOf [SeasonalityService]'而不是'seasonality.getClass'。這將使用接口,而不是您在下面返回的匿名類。 –

回答

1

如果我理解正確的話,你希望對你的嘲笑爲doSomeForBdoSomeForB1電話。但是你的代碼在你給他們打電話之前驗證之前的這個期望,所以測試失敗。

此外,你的嘲笑被定義爲本地方法,這意味着在每次調用時你會得到一個新的模擬對象。您需要將它們轉換爲本地vals,以便您交互(並驗證)相同的實例。

修改它看起來像:

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() 
    } 
+0

謝謝呂麗安! – Nikolay