在 之前的一篇文章 中,我向您展示了如何使用 RAML 作为规范框架来创建契约驱动的 REST 服务。然而,RAML 测试器库并不局限于能够测试 Spring MVC 控制器。您还可以使用它来测试任何 REST API 并检查它是否符合 RAML 规范。
CheckingWebTarget 类
raml-tester 库有一个实用程序类,用于检查 REST 调用和该调用的结果是否符合给定的规范:CheckingWebTarget。为此,您需要一个 JAX-RS 客户端 API 实现,这是一个用于 REST 服务的通用客户端 API。在我的示例中,我使用的是 Jersey,它是参考实现,但您可以自由选择其他实现。这是测试:
public class RestApiTests {
private static final RamlDefinition raml = RamlLoaders.fromClasspath(RestApiTests.class).load("helloworld.raml")
.assumingBaseUri("http://localhost/");
private JerseyClient client = new JerseyClientBuilder().build();
private CheckingWebTarget checking;
@Before
public void createTarget() {
checking = raml.createWebTarget(client.target("http://localhost"));
}
@Test
public void testHelloEndpoint() {
checking.path("/hello").request().get();
Assert.assertThat(checking.getLastReport(), RamlMatchers.hasNoViolations());
}
}
例如,如果您想使用 RestEASY,只需将客户端声明替换为:
public class RestApiTests {
private static final RamlDefinition raml = RamlLoaders.fromClasspath(RestApiTests.class).load("helloworld.raml")
.assumingBaseUri("http://localhost/");
private JerseyClient client = new JerseyClientBuilder().build();
private CheckingWebTarget checking;
@Before
public void createTarget() {
checking = raml.createWebTarget(client.target("http://localhost"));
}
@Test
public void testHelloEndpoint() {
checking.path("/hello").request().get();
Assert.assertThat(checking.getLastReport(), RamlMatchers.hasNoViolations());
}
}
此服务的基本规范是:
public class RestApiTests {
private static final RamlDefinition raml = RamlLoaders.fromClasspath(RestApiTests.class).load("helloworld.raml")
.assumingBaseUri("http://localhost/");
private JerseyClient client = new JerseyClientBuilder().build();
private CheckingWebTarget checking;
@Before
public void createTarget() {
checking = raml.createWebTarget(client.target("http://localhost"));
}
@Test
public void testHelloEndpoint() {
checking.path("/hello").request().get();
Assert.assertThat(checking.getLastReport(), RamlMatchers.hasNoViolations());
}
}
此测试将调用
http://localhost/hello
并根据 RAML 规范检查调用是否有效。它还将检查结果是否有效,例如,如果结果不是 JSON 文档,或者当服务返回 HTTP 状态代码 200 以外的其他内容时,测试将在这种情况下失败。如果您想要更广泛的例如,我建议尝试我在本文开头提到的文章,并尝试使用 Spring MVC 或 JAX-RS 以这种方式实现它。或者,如果您想快速尝试一些不同的东西,请尝试使用
Spark
来完成。
该系统允许您使用 RAML 规范测试几乎每个 REST API,而与您用于实现该 REST API 的机制无关。如果您正在考虑使用 API Blueprint 或 Swagger 做同样的事情,您将需要做更多的工作。 API Blueprint 没有像样的 Java 支持(snowcrash 不是像样的支持)并且 Swagger 仍然真正支持设计优先的方法。目前,如果你想要测试契约驱动的开发,RAML 目前是 Javaland 中唯一的选择。