Documentation建议使用模拟Web服务测试基于WSClient的API客户端,即创建一个响应真实HTTP请求的play.server.Server
。
我更喜欢直接从文件创建WSResponse
个对象,包括状态行,标题行和正文,没有真正的TCP连接。这将需要更少的依赖性并且运行得更快。如果有用,可能还有其他情况。
但我无法找到一种简单的方法。似乎WSResponse
包含的所有实现都与从网络读取相关联。
我是否应该为此创建自己的WSResponse子类,或者我错了并且它已经存在?
答案 0 :(得分:1)
Play的API似乎是故意的钝。你必须使用他们的“可缓存”类,它们是唯一可以直接从你所在的对象中实例化的类。
这应该让你开始:
fit
没有记录神秘的布尔值。我的猜测是BodyPart的布尔值是否是身体的最后一部分。我对Headers的猜测是标题是否在邮件的预告片中。
答案 1 :(得分:1)
如果您使用的是play-framework 2.8.x
和scala
,则下面的代码可以帮助我们生成虚拟的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();