如何从Play WSClient的字符串创建WSResponse对象

时间:2016-01-12 20:50:46

标签: java testing playframework playframework-2.0 ws-client

Documentation建议使用模拟Web服务测试基于WSClient的API客户端,即创建一个响应真实HTTP请求的play.server.Server

我更喜欢直接从文件创建WSResponse个对象,包括状态行,标题行和正文,没有真正的TCP连接。这将需要更少的依赖性并且运行得更快。如果有用,可能还有其他情况。

但我无法找到一种简单的方法。似乎WSResponse包含的所有实现都与从网络读取相关联。

我是否应该为此创建自己的WSResponse子类,或者我错了并且它已经存在?

3 个答案:

答案 0 :(得分:1)

Play的API似乎是故意的钝。你必须使用他们的“可缓存”类,它们是唯一可以直接从你所在的对象中实例化的类。

这应该让你开始:

fit

没有记录神秘的布尔值。我的猜测是BodyPart的布尔值是否是身体的最后一部分。我对Headers的猜测是标题是否在邮件的预告片中。

答案 1 :(得分:1)

如果您使用的是play-framework 2.8.xscala,则下面的代码可以帮助我们生成虚拟的WSResponse

import play.api.libs.ws.ahc.AhcWSResponse
import play.api.libs.ws.ahc.cache.CacheableHttpResponseStatus
import play.shaded.ahc.org.asynchttpclient.Response
import play.shaded.ahc.org.asynchttpclient.uri.Uri
import play.api.libs.ws.ahc.cache.CacheableHttpResponseBodyPart
import play.shaded.ahc.io.netty.handler.codec.http.DefaultHttpHeaders

class OutputWriterSpec extends FlatSpec with Matchers {
  val respBuilder = new Response.ResponseBuilder()
  respBuilder.accumulate(new CacheableHttpResponseStatus(Uri.create("http://localhost:9000/api/service"), 202, "status text", "json"))
  respBuilder.accumulate(new DefaultHttpHeaders().add("Content-Type", "application/json"))
  respBuilder.accumulate(new CacheableHttpResponseBodyPart("{\n\"id\":\"job-1\",\n\"lines\": [\n\"62812ce276aa9819a2e272f94124d5a1\",\n\"13ea8b769685089ba2bed4a665a61fde\"\n]\n}".getBytes(), true))
  val resp = new AhcWSResponse(respBuilder.build())

  val outputWriter = OutputWriter

  val expected = ("\"job-1\"", List("\"62812ce276aa9819a2e272f94124d5a1\"", "\"13ea8b769685089ba2bed4a665a61fde\""), "_SUCCESS")
  "Output Writer" should "handle response from api call" in {
    val actual = outputWriter.handleResponse(resp, "job-1")
    println("the actual : " + actual)
    actual shouldEqual(expected)

  }
}

答案 2 :(得分:0)

我使用了另一种方法,用WSResponse来模拟Mockito

import play.libs.ws.WSRequest;
import play.libs.ws.WSResponse;
import org.mockito.Mockito;

...

          final WSResponse wsResponseMock = Mockito.mock(WSResponse.class);
          Mockito.doReturn(200).when(wsResponseMock).getStatus();
          final String jsonStr = "{\n"
                  + "  \"response\": {\n"
                  + "    \"route\": [\n"
                  + "      { \"summary\" :\n"
                  + "        {\n"
                  + "          \"distance\": 23\n"
                  + "        }\n"
                  + "      }\n"
                  + "    ]\n"
                  + "  }\n"
                  + "}";
          ObjectMapper mapper = new ObjectMapper();
          JsonNode jsonNode = null;
          try {
            jsonNode = mapper.readTree(jsonStr);
          } catch (IOException e) {
            e.printStackTrace();
          }
          Mockito.doReturn(
                  jsonNode)
              .when(wsResponseMock)
              .asJson();