【问题标题】:Specs2 - Mock objects inside methodSpecs2 - 方法内的模拟对象
【发布时间】:2016-03-14 19:17:00
【问题描述】:

我正在编写单元测试,我想知道是否可以模拟在我正在测试的方法中实例化的对象。

这是我想测试的方法示例:

def sendMessageToBroker(message:Message) = {

  val soapBody = xmlBody("user", "pass", message.identifier, 
      message.to, message.message)

  val response = new WebServiceUtil().doPost("uri", soapBody.toString(),
  "text/xml; charset=utf-8", "action")

  response
} 

我想知道是否可以这样做:

when call doPost, return new Response(200, 'Success')

有可能吗?

我尝试过使用 spy() 和 mock,但没有成功:

val ws = new WebServiceUtil

val spiedObj = spy(ws)
spiedObj.doPost("uri", xml,
  "text/xml; charset=utf-8",
  "action") returns new Response(200, "Success")

val xx = messageService.sendMessageToBroker(new Message())

关于我该怎么做的任何想法?

【问题讨论】:

    标签: scala mocking playframework-2.0 specs2


    【解决方案1】:

    你可以写

    val webService = mock[WebServiceUtil]
    
    webService.doPost("uri", xml, "text/xml; charset=utf-8", "action") returns 
       new Response(200, "Success")
    
    // pass the mock webservice as an argument
    sendMessageToBroker(new Message, webService)
    

    重要的部分是您需要能够将模拟WebServiceUtil 传递给您正在测试的方法!有很多方法可以做到这一点。最简单的一种是将实例传递给我们“被测类”的构造方法:

    class MyClass(webService: WebServiceUtil) {
      def sendMessageToBroker(message: Message) = {
        // use the webservice
      }
    }
    

    更复杂的方法是使用 Guice 和 Inject 注释来传递服务(特别是因为您将问题标记为 play-framework-2.0 之一)。届时您将有兴趣关注this SOF question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多