【问题标题】:Mockito when/thenReturn always returning null in Scala Test when trying to mock rabbitmq ConnectionFactory尝试模拟 rabbitmq ConnectionFactory 时,Mockito when/thenReturn 总是在 Scala 测试中返回 null
【发布时间】:2011-12-28 19:34:11
【问题描述】:

我正在尝试使用 scalatest 和 mockito 模拟 RabbitMQ ConnectionFactory 对象以返回模拟连接。以下是我正在使用的示例测试:

class RabbitMQMockTest extends FunSuite with MockitoSugar {
    test("RabbitMQ ConnectionFactory is correctly mocked") {
        def connectionFactory = mock[ConnectionFactory]
        def connection = mock[Connection]

        when(connectionFactory.newConnection()).thenReturn(connection)
        println(connectionFactory.newConnection())

        assert(connectionFactory.newConnection() != null)
    }
}

这总是失败,并且 println 语句总是打印“null”。我对一起使用这些技术非常陌生,想知道是否有人有任何建议或可以让我知道我是否做错了什么。提前致谢!

【问题讨论】:

  • 你能打破你的测试只依赖模拟Connection吗?以这种方式模拟多个级别的依赖项通常是令人讨厌的——您最终会维护大量脆弱的模拟代码,这些代码本身不会为您的项目增加价值。
  • 是的,我同意有一个返回模拟的模拟通常是一种测试气味。对于连接东西附近的东西,我会改为编写集成测试而不是单元测试。关于您的问题,您是否对其他类(如您的类)有同样的不稳定行为。
  • 大家好,感谢您的回复!我绝对同意你们俩的观点,这远非理想,我计划重构被测类以允许更好的依赖注入。然而,我确实解决了我的问题,结果证明我犯了一个彻头彻尾的错误。我使用“def”而不是“val”或“var”定义了模拟类,所以每次调用其中一个方法时,我都会创建一个新的模拟。很抱歉浪费大家的时间,再次感谢cmets!

标签: scala rabbitmq mockito scalatest


【解决方案1】:

不要意外使用'def'定义变量!我使用“def”而不是“val”或“var”来定义模拟,所以我创建了一个每次都返回一个新模拟的方法,而不是一个变量。

【讨论】:

  • 这实际上是一个非常常见的问题,我很惊讶在博客/文档/等中没有经常提到它。
【解决方案2】:

我认为你应该在connection mock 上定义一个行为,然后才能使用它。例如:

when(connection.createChannel()).thenReturn(new Channel {...})

或类似的东西。

【讨论】:

  • 感谢您的回复!原来我只是不小心用 def 来定义 mock,而不是 val 或 var。
猜你喜欢
  • 2022-12-18
  • 2021-05-05
  • 1970-01-01
  • 2020-09-11
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
相关资源
最近更新 更多