Mockito when/thenReturn在尝试模拟rabbitmq连接工厂时,在Scala测试中始终返回null

Mockito when/thenReturn在尝试模拟rabbitmq连接工厂时,在Scala测试中始终返回null,scala,rabbitmq,mockito,scalatest,Scala,Rabbitmq,Mockito,Scalatest,我试图使用scalatest和mockito模拟RabbitMQ ConnectionFactory对象以返回模拟的连接。下面是我正在使用的一个示例测试: class RabbitMQMockTest extends FunSuite with MockitoSugar { test("RabbitMQ ConnectionFactory is correctly mocked") { def connectionFactory = mock[ConnectionFact

我试图使用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
mock上定义一个行为。例如:

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

或者类似的东西。

我认为在能够使用它之前,您应该在
连接
模拟上定义一个行为。例如:

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

或者类似的东西。

不要意外地使用“def”定义变量!我使用“def”而不是“val”或“var”定义了mock,因此我创建了一个每次都返回一个新mock的方法,而不是一个变量。

不要意外地使用“def”定义变量!我使用“def”而不是“val”或“var”定义了mock,因此我创建了一个方法,每次都返回一个新的mock,而不是一个变量。

您能否中断测试以仅依赖mock
连接
?用这种方式模拟多个层次的依赖关系通常是令人讨厌的——你最终会维护大量脆弱的模拟代码,而这些代码本身并不会为你的项目增加价值。是的,我同意,有一个返回模拟的模拟通常是一种测试味道。对于一些接近连接的东西,我宁愿编写集成测试而不是单元测试。关于你的问题,你有没有和其他类(比如你的类)一样不稳定的行为。嘿,伙计们,谢谢你们的回答!我完全同意你们两位的观点,这远远不够理想,我计划重构测试中的类,以允许更好的依赖注入。然而,我确实解决了我的问题,结果我犯了一个愚蠢的错误。我使用'def'而不是'val'或'var'定义了mock类,因此每次调用其中一个方法时,我都在创建一个新的mock。很抱歉浪费了你们的时间,再次感谢你们的评论!您能否将测试分解为仅依赖模拟
连接
?用这种方式模拟多个层次的依赖关系通常是令人讨厌的——你最终会维护大量脆弱的模拟代码,而这些代码本身并不会为你的项目增加价值。是的,我同意,有一个返回模拟的模拟通常是一种测试味道。对于一些接近连接的东西,我宁愿编写集成测试而不是单元测试。关于你的问题,你有没有和其他类(比如你的类)一样不稳定的行为。嘿,伙计们,谢谢你们的回答!我完全同意你们两位的观点,这远远不够理想,我计划重构测试中的类,以允许更好的依赖注入。然而,我确实解决了我的问题,结果我犯了一个愚蠢的错误。我使用'def'而不是'val'或'var'定义了mock类,因此每次调用其中一个方法时,我都在创建一个新的mock。很抱歉浪费了你们的时间,再次感谢你们的评论!谢谢你的回复!事实证明,我只是意外地使用def来定义mock,而不是val或var。感谢您的回复!事实证明,我只是意外地使用def来定义mock,而不是val或var。这实际上是一个非常常见的问题,我很惊讶在blog/docs/etc中没有更多地提到它。这实际上是一个非常常见的问题,我很惊讶没有更多地在blog/docs/etc中提到它。