【问题标题】:Why Mockito doesn't handle default Scala parameters properly?为什么 Mockito 不能正确处理默认的 Scala 参数?
【发布时间】:2015-10-06 16:50:16
【问题描述】:

我有一个类似的代码

  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 中没有默认参数。有什么解决办法吗?

谢谢。

【问题讨论】:

    标签: scala mockito scalatest


    【解决方案1】:

    我猜这是因为 CGLIB(或 Byte Buddy 在 2.0 beta 的情况下)在这种情况下生成代码,而不是 Scala 编译器,因此默认参数将始终为 null

    一种解决方法可能是(至少在某些情况下)改用spy

    val mockTest = spy(classOf[ToTest])
    

    抱歉,ScalaTest 中没有糖语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 2014-07-18
      • 2019-05-21
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      相关资源
      最近更新 更多