【发布时间】:2014-10-23 05:52:06
【问题描述】:
假设我在我的应用程序中创建了一个简单的客户端,它使用一个远程 Web 服务,该服务在某个 URI /foo/bar/{baz} 处公开一个 RESTful API。现在我希望对调用此 Web 服务的客户端进行单元测试。
理想情况下,在我的测试中,我想模拟我从 Web 服务获得的响应,给定一个特定的请求,例如 /foo/bar/123 或 /foo/bar/42。我的客户假设 API 实际上在某个地方运行,因此我需要一个本地“Web 服务”来开始在 http://localhost:9090/foo/bar 上运行以进行测试。
我希望我的单元测试是独立的,类似于使用 Spring MVC 测试框架测试 Spring 控制器。
一些简单客户端的伪代码,从远程 API 获取数字:
// Initialization logic involving setting up mocking of remote API at
// http://localhost:9090/foo/bar
@Autowired
NumberClient numberClient // calls the API at http://localhost:9090/foo/bar
@Test
public void getNumber42() {
onRequest(mockAPI.get("/foo/bar/42")).thenRespond("{ \"number\" : 42 }");
assertEquals(42, numberClient.getNumber(42));
}
// ..
我有哪些使用 Spring 的替代方案?
【问题讨论】:
-
你利用 DTO 模式吗?
-
@Manu 你的意思是如果我将 JSON 编组到我的客户端中的域对象或从 JSON 编组到域对象?
-
更准确地说,如果您编组/解组为代表网络中域实体的中间对象
-
@Manu 不,我没有中间对象,只有域对象和 JSON 文本。
-
那么我建议开始使用 DTO 模式,并按照与测试 MVC 控制器相同的方式进行操作。
标签: java unit-testing rest spring-test