- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Spring Restdocs 基于 Spring MVC 测试。因此,我想弄清楚是否可以将 Spring Restdocs 与 Jersey 2.0 REST 应用程序集成。
如果是这样,能否请您指出任何相关示例或教程。
最佳答案
注意:下面的更新 2:已发布第三方库以与 Jersey 一起使用
他们目前正在研究 restassured support它与 MVC(或任何其他服务器框架)无关。我想这应该在 1.1.0 中发布。我添加了一个 feature request对于 Jersey Test Framework 支持,但我不知道他们对此有何看法。如果你想看到对它的支持,你可以在问题中发表评论。但我想他们会采取不需要 Jersey Test Framework 支持的立场,因为您仍然可以使用 REST Assured 作为 Jersey Test Framework 测试用例的客户端。但我们会看到,你永远不会知道 ;-)
在这个答案发布后不久,Spring REST Docs 将 rest-assured 分支与 master 分支合并,因此您现在可以使用 spring-restdocs-restassured
的快照不需要自己构建项目的工件。您只需要添加 Spring Snapshot 存储库。下面是一个使用 Jersey 测试框架的完整示例。
import java.util.logging.Logger;
import javax.ws.rs.Consumes;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import org.glassfish.jersey.filter.LoggingFilter;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Rule;
import org.junit.Test;
import org.springframework.restdocs.RestDocumentation;
import com.fasterxml.jackson.databind.ObjectMapper;
import static com.jayway.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields;
import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName;
import static org.springframework.restdocs.request.RequestDocumentation.pathParameters;
import static org.springframework.restdocs.restassured.RestAssuredRestDocumentation.document;
import static org.springframework.restdocs.restassured.RestAssuredRestDocumentation.documentationConfiguration;
/**
* Stack Overflow http://stackoverflow.com/q/35068860/2587435
*
* Run this like any other JUnit test. The required dependencies are listed below. You will need
* to add the Spring Snapshot repository, also listed below.
*
* Running the test should produces the following snippets in target/generated-snippets/example-put:
*
* - curl-request.adoc
* - http-request.adoc
* - http-response.adoc
* - path-parameters.adoc
* - request-fields.adoc
* - response-fields.adoc
*
* <dependencies>
* <dependency>
* <groupId>org.springframework.restdocs</groupId>
* <artifactId>spring-restdocs-restassured</artifactId>
* <version>1.1.0.BUILD-SNAPSHOT</version>
* <scope>test</scope>
* </dependency>
* <dependency>
* <groupId>org.glassfish.jersey.test-framework.providers</groupId>
* <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
* <version>2.22.1</version>
* <scope>test</scope>
* </dependency>
* <dependency>
* <groupId>org.glassfish.jersey.media</groupId>
* <artifactId>jersey-media-json-jackson</artifactId>
* <version>2.22.1</version>
* <scope>test</scope>
* </dependency>
* <dependency>
* <groupId>commons-logging</groupId>
* <artifactId>commons-logging</artifactId>
* <version>1.2</version>
* <scope>test</scope>
* </dependency>
* <dependency>
* <groupId>org.hamcrest</groupId>
* <artifactId>hamcrest-all</artifactId>
* <version>1.3</version>
* <scope>test</scope>
* </dependency>
* </dependencies>
*
* <repositories>
* <repository>
* <id>spring-snapshots</id>
* <name>Spring snapshots</name>
* <url>https://repo.spring.io/libs-snapshot</url>
* <snapshots>
* <enabled>true</enabled>
* </snapshots>
* </repository>
* </repositories>
*
* @author Paul Samsotha
*/
public class RestAssuredDocs extends JerseyTest {
@Rule
public final RestDocumentation restDocumentation
= new RestDocumentation("target/generated-snippets");
public static class TestBean {
public int id;
public String message;
public TestBean (){}
public TestBean(int id, String message) {
this.id = id;
this.message = message;
}
}
@Path("test")
@Produces("application/json")
@Consumes("application/json")
public static class TestResource {
@PUT
@Path("{id}")
public TestBean update(TestBean bean) {
return bean;
}
}
@Override
public ResourceConfig configure() {
return new ResourceConfig(TestResource.class)
.register(new LoggingFilter(Logger.getAnonymousLogger(), true));
}
private final int port = 9998;
private final ObjectMapper mapper = new ObjectMapper();
@Test
public void examplePut() throws Exception {
TestBean bean = new TestBean(1, "a message");
given().port(this.port)
.filter(documentationConfiguration(this.restDocumentation))
.filter(document("example-put",
requestFields(
fieldWithPath("id").description("The id"),
fieldWithPath("message").description("The message")
),
responseFields(
fieldWithPath("id").description("The id"),
fieldWithPath("message").description("The message")
),
pathParameters(
parameterWithName("id").description("The id")
)
))
.contentType("application/json")
.accept("application/json")
.content(mapper.writeValueAsString(bean))
.put("/test/{id}", "1")
.then()
.statusCode(200)
.body("id", equalTo(1))
.body("message", equalTo("a message"));
}
}
有关如何使用 REST Assured 的更多示例,请访问 User Guide
我 刚刚发布了 Jersey 的一个实现。您可以找到项目 here 。基本用法如下所示。查看项目中的wiki获取更多信息
依赖性
<properties>
<your.jersey.version>2.23</your.jersey.version>
<restdocsext.jersey.version>0.1.0</restdocsext.jersey.version>
</properties>
<dependencies>
<dependency>
<groupId>io.github.restdocsext</groupId>
<artifactId>restdocsext-jersey</artifactId>
<version>${restdocsext.jersey.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>${your.jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${your.jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>${your.jersey.version}</version>
</dependency>
</dependencies>
示例
// Other imports excluded for brevity
import static io.github.restdocsext.jersey.JerseyRestDocumentation.document;
import static io.github.restdocsext.jersey.JerseyRestDocumentation.documentationConfiguration;
import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest;
import static org.springframework.restdocs.operation.preprocess.Preprocessors.removeHeaders;
public class SimpleDocumentation extends JerseyTest {
@Rule
public JUnitRestDocumentation documentation
= new JUnitRestDocumentation("target/generated-snippets");
@Path("test")
public static class TestResource {
@GET
public String getSimple() {
return "SimpleTesting";
}
}
@Override
public ResourceConfig configure() {
return new ResourceConfig(TestResource.class);
}
@Test
public void getSimple() {
final Response response = target("test")
.register(documentationConfiguration(this.documentation))
.register(document("get-simple",
preprocessRequest(removeHeaders("User-Agent"))))
.request()
.get();
assertThat(response.getStatus(), is(200));
assertThat(response.readEntity(String.class), is("SimpleTesting"));
}
}
关于java - 是否可以将 Spring Restdocs 与 Jersey 应用程序一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35068860/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!