2011-12-28 63 views
1

我试图模拟RabbitMQ ConnectionFactory对象返回使用scalatest和mockito的模拟连接。下面是我正在使用的一个示例测试:当试图模拟rabbitmq时,Mockito when/thenReturn总是返回Scala测试中的null 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”。我对使用这些技术非常陌生,想知道是否有人有任何建议,或者如果我做错了任何事情,可以告诉我。提前致谢!

+0

你可以打破你的测试只依靠模拟'连接'?通过这种方式来模拟多层次的依赖关系通常是令人讨厌的 - 最终会保留大量脆弱的模拟代码,这本身并不会增加项目的价值。 – earldouglas 2011-12-30 15:24:42

+0

是的,我同意有一个模拟回归模拟通常是一种测试气味。对于接近连接的东西,我会写集成测试,而不是单元测试。 关于你的问题,你有没有与其他类(如你的类)相同的不稳定行为。 – Brice 2012-01-01 11:41:18

+0

嘿家伙,谢谢你的回复!我绝对同意你们两人的看法,认为这远非理想,我打算重构被测试的类以允许更好的依赖注入。然而,我确实解决了我的问题,结果证明我犯了一个错误。我使用'def'而不是'val'或'var'来定义模拟类,所以每当我调用其中一种方法时,我就会创建一个新的模拟。很抱歉浪费你们的时间,再次感谢评论! – Bryan 2012-01-03 15:42:46

回答

5

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

+0

这实际上是一个非常常见的疑难杂症,我很惊讶没有看到它在博客/文档/等更经常提到。 – casey 2015-11-17 01:29:50

0

我想你应该定义一个行为connection模拟才能使用它。例如:

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

或类似的东西。

+0

感谢您的回应!事实证明,我只是不小心使用def来定义模拟而不是val或var。 – Bryan 2012-01-03 15:46:49