【问题标题】:Scala Mockito: allow only certain (i.e. whitelist) methods to be calledScala Mockito:只允许调用某些(即白名单)方法
【发布时间】:2020-01-26 12:55:43
【问题描述】:

我怎样才能只创建某些方法的模拟和“白名单”?

例如,如果我有一个特征 Foo,我希望只允许调用 a() 和 b(),而不允许任何其他方法 - 没有明确地将它们列入黑名单。

trait Foo {
    def a()
    def b()
    def c()
    def d()
}

val mfoo = mock[Foo]
whitelist(mfoo.a, mfoo.b)
mfoo.c() // should fail since it's not whitelisted

【问题讨论】:

  • 这能回答你的问题吗? Is it possible to do strict mocks with Mockito?
  • @solyd 我不确定你引用那个链接是什么意思,但如果你认为它说你不能使用Answer,那肯定不是这样:你非常可以 使用它。
  • @Dima 我想为我的简单用例提供一个示例,因为我无法让它工作。
  • @solyd “无法正常工作”到底是什么意思?您是否尝试按照 SO 答案的建议进行操作?

标签: scala unit-testing mockito


【解决方案1】:

mockito-scala-scalatest 使用严格模式,当您在严格模式下工作时,任何您不存根/验证并且由您的代码调用的方法都会使测试失败,并出现异常说明您不应该调用上述方法

【讨论】:

    【解决方案2】:

    当我使用 Mockito 时,我使用了 verifyNoMoreInteractions()

    您可以存根您的模拟,然后您可以验证没有发生其他调用。

    在当前版本中还有其他验证方法。看看here

    【讨论】:

    • 这并不能解决我的问题,因为verify(x).foo() 等同于verify(x, times(1)).foo()。我只想允许调用foo,而不是确保它至少被调用一次。
    • 我没发现问题:val m= mock[Foo]; m.a(); m.b(); m.c(); verify(m, atLeastOnce(),).a(); verify(m, atMostOnce()).b();verifyNoMoreInteractions(m) // <- this should fail as c() is called
    • @thopaw 问题是如果不调用a() 将会失败
    • @thopaw 使用atLeast(0)
    【解决方案3】:

    为了清楚起见:

    您可以使用verify(mfoo, atLeast(0)).a() 允许零次或多次调用a() 方法,从而将其列入白名单。

    trait Foo {
        def a()
        def b()
        def c()
        def d()
    }
    
    val mfoo = mock[Foo]
    
    // ... test code ...
    
    // whitelisting a() and b() is equivalent to:
    verify(mfoo, atLeast(0)).a()
    verify(mfoo, atLeast(0)).b()
    
    // everything else is blacklisted by default:
    verifyNoMoreInteractions(mfoo)
    

    附言您还可以使用 Answer 构造 (Mockito's Answer in ScalaTest) 挂钩到模拟对象上的任何调用,但我在代码中没有成功这样做。

    【讨论】:

      猜你喜欢
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 2021-01-23
      相关资源
      最近更新 更多