2015-10-06 95 views
0

我有這樣爲什麼Mockito不能正確處理默認的Scala參數?

test("mockito test") { 
    class ToTest { 
     def run(maybe: Option[Int], q: Option[Int] = None): Int = 42 
    } 

    val mockTest = mock[ToTest] 
    when(mockTest.run(None, None)).thenReturn(98) 
    mockTest.run(None) 
    verify(mockTest, times(1)).run(None, None) 
    } 

守則,失敗

[info] - mockito test *** FAILED *** 
[info] org.mockito.exceptions.verification.junit.ArgumentsAreDifferent: Argument(s) are different! Wanted: 
[info] toTest$1.run(None, None); 
[info] -> at xxx$$anonfun$3.apply$mcV$sp(xxx.scala:55) 
[info] Actual invocation has different arguments: 
[info] toTest$1.run(None, null); 

或者另一種情形

test("mockito test") { 
    class ToTest { 
     def run(maybe: Option[Int], q: Int = 5): Int = 42 
    } 

    val mockTest = mock[ToTest] 
    when(mockTest.run(None, 5)).thenReturn(101) 
    mockTest.run(None) 
    verify(mockTest, times(1)).run(None, 5) 
    } 

其失敗

[info] - mockito test *** FAILED *** 
[info] org.mockito.exceptions.verification.junit.ArgumentsAreDifferent: Argument(s) are different! Wanted: 
[info] toTest$1.run(None, 5); 
[info] -> at xxx$$anonfun$3.apply$mcV$sp(xxx.scala:55) 
[info] Actual invocation has different arguments: 
[info] toTest$1.run(None, 0); 

我想這這是因爲Java中沒有默認參數。有沒有解決方法?

謝謝。

回答

0

我想這是因爲CGLIB(或2.0版本的Byte Buddy)在這種情況下生成代碼,而不是Scala編譯器,因此默認參數將始終爲null

一種解決方法可能是(至少在某些情況下)使用spy代替:

val mockTest = spy(classOf[ToTest]) 

對不起,ScalaTest不加糖的語法它。

相關問題