This commit is contained in:
Marcin Grzejszczak
2019-07-25 18:03:52 +02:00
parent bffe539f4b
commit e9d467877c
10 changed files with 70 additions and 57 deletions

View File

@@ -1295,7 +1295,7 @@ TIP: As you can see, it is much better if you name your contracts because doing
your tests far more meaningful.
[[contract-stateful-contracts]]
== Stateful Contracts
=== Stateful Contracts
Stateful contracts (known also as scenarios) are contract definitions that should be read in order. This might be useful in the following situations:

View File

@@ -1,7 +1,10 @@
[[features-jax-rs]]
== JAX-RS
[[feature-integrations]]
== Integrations
include::_attributes.adoc[]
[[features-jax-rs]]
=== JAX-RS
The Spring Cloud Contract supports the JAX-RS 2 Client API. The base class needs
to define `protected WebTarget webTarget` and server initialization. The only option for
testing JAX-RS API is to start a web server. Also, a request with a body needs to have a
@@ -21,15 +24,10 @@ The following example shows a generated test API:
include::{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientMethodBuilderSpec.groovy[tags=jaxrs,indent=0]
----
[[contract-webflux]]
== WebFlux
Spring Cloud Contract offers two ways of working with WebFlux.
[[contract-webtestclient]]
[[feature-webflux]]
=== WebFlux with WebTestClient
One of them is via the `WebTestClient` mode.
You can work with WebFlux via the `WebTestClient` mode.
====
[source,xml,indent=0,subs="verbatim,attributes",role="primary"]
@@ -74,7 +72,9 @@ public abstract class BeerRestBase {
}
----
[[contract-webflux-explicit]]
IMPORTANT: The `WebTestClient` mode is faster than the `EXPLICIT` mode
[[feature-webflux-explicit]]
=== WebFlux with Explicit mode
Another way is with the `EXPLICIT` mode in your generated tests

View File

@@ -1,7 +1,7 @@
include::_attributes.adoc[]
[[features-messaging]]
== Messaging
include::_attributes.adoc[]
Spring Cloud Contract lets you verify applications that use messaging as a
means of communication. All of the integrations shown in this document work with Spring,
but you can also create one of your own and use that.

View File

@@ -1,4 +1,4 @@
[[features-stub-runner-features-stub-runner]]
[[features-stub-runner]]
== Spring Cloud Contract Stub Runner
One of the issues that you might encounter while using Spring Cloud Contract Verifier is
@@ -9,7 +9,7 @@ Copying the JSON files and setting the client side for messaging manually is out
question. That is why we introduced Spring Cloud Contract Stub Runner. It can
automatically download and run the stubs for you.
[[features-stub-runner-features-stub-runner-snapshot-versions]]
[[features-stub-runner-snapshot-versions]]
=== Snapshot versions
Add the additional snapshot repository to your `build.gradle` file to use snapshot
@@ -77,8 +77,7 @@ You can pick the following options of acquiring stubs
- Classpath scanning solution that searches classpath via pattern to retrieve stubs
- Write your own implementation of the `org.springframework.cloud.contract.stubrunner.StubDownloaderBuilder` for full customization
// TODO: Fix link
The latter example is described in the <<custom_stub_runner, Custom Stub Runner>> section.
The latter example is described in the <<advanced.adoc#customization-custom-stub-runner, Custom Stub Runner>> section.
[[features-stub-runner-downloading-stub]]
===== Stub downloading
@@ -382,8 +381,7 @@ include::{stubrunner_core_path}/src/test/java/org/springframework/cloud/contract
----
====
//TODO: Fix link
Check the *Common properties for JUnit and Spring* for more information on how to apply global configuration of Stub Runner.
Check the <<features-stub-runner-common-properties-junit-spring>> for more information on how to apply global configuration of Stub Runner.
IMPORTANT: To use the JUnit rule or JUnit 5 extension together with messaging, you have to provide an implementation of the
`MessageVerifier` interface to the rule builder (e.g. `rule.messageVerifier(new MyMessageVerifier())`).

View File

@@ -193,8 +193,7 @@ that will start the standalone version of Stub Runner.
[[docker-stubrunner-env-vars]]
=== Environment variables
//TODO: Fix the link
Just execute the docker image. You can pass any of the <<common-properties-junit-spring>>
Just execute the docker image. You can pass any of the <<project-features.adoc#features-stub-runner-common-properties-junit-spring, Common Properties for JUnit and Spring>>
as environment variables. The convention is that all the
letters should be upper case. The camel case notation should
and the dot (`.`) should be separated via underscore (`_`). E.g.

View File

@@ -80,15 +80,22 @@ Need more details about {project-full-name}'s core features?
<<project-features.adoc#features, The following content is for you>>:
* *Core Features:*
<<{project-name}-features.adoc#contract-features-spring-application, SpringApplication>> |
<<{project-name}-features.adoc#contract-features-external-config, External Configuration>>
<<project-features.adoc#contract-dsl, Contract DSL>> |
<<project-features.adoc#features-messaging, Messaging>>
* *Integrations:*
<<project-features.adoc#features-jax-rs, JAX-RS>> |
<<project-features.adoc#features-webflux, WebFlux>> |
<<project-features.adoc#features-context-paths, Context Paths>> |
<<project-features.adoc#features-rest-docs, RESTDocs>>
* *Modules:*
<<project-features.adoc#features-stub-runner, Stub Runner>> |
<<project-features.adoc#features-wiremock, WireMock>>
* *Build tools:*
link:maven-project.html[Maven] |
link:gradle-project.html[Gradle] |
link:docker-project.html[Docker]
== Advanced Topics
Finally, we have a few topics for more advanced users:

View File

@@ -29,7 +29,7 @@ The `0.1.0` release took place on 26 Jan 2015 and it became stable with `1.0.0`
Assume that we have a system consisting of multiple microservices:
image::images/Deps.png[Microservices Architecture]
image::Deps.png[Microservices Architecture]
[[getting-started-introducing-spring-cloud-contract-testing-issues]]
==== Testing issues
@@ -76,7 +76,7 @@ To solve the aforementioned issues, Spring Cloud Contract was created. The main
whole world of microservices. If you work on stubs, then the only applications you need
are those that your application directly uses.
image::images/Stubs2.png[Stubbed Services]
image::Stubs2.png[Stubbed Services]
Spring Cloud Contract gives you the certainty that the stubs that you use were
created by the service that you're calling. Also, if you can use them, it means that they
@@ -108,8 +108,8 @@ As consumers of services, we need to define what exactly we want to achieve. We
formulate our expectations. That is why we write contracts. In other words a contract is an agreement on how the API / message communication should look like. Let's look at the following example
Assume that you want to send a request containing the ID of a client company and the
amount it wants to borrow from us. You also want to send it to the /fraudcheck url via
the PUT method.
amount it wants to borrow from us. You also want to send it to the `/fraudcheck` url via
the `PUT` method.
====
[source,groovy,indent=0,role="primary"]
@@ -157,7 +157,7 @@ You can find a somewhat longer tour
[[getting-started-three-second-tour-producer]]
=== On the Producer Side
To start working with Spring Cloud Contract, add files with `REST`/messaging contracts
To start working with Spring Cloud Contract, add files with REST/messaging contracts
expressed in either Groovy DSL or YAML to the contracts directory, which is set by the
`contractsDslDir` property. By default, it is `$rootDir/src/test/resources/contracts`.
@@ -653,6 +653,7 @@ For simplicity we will use the following acronyms:
- Fraud Detection - FD - the http server
- Spring Cloud Contract - SCC
[[getting-started-cdc-consumer]]
=== Consumer side (Loan Issuance)
As a developer of the Loan Issuance service (a consumer of the Fraud Detection server), you might do the following steps:
@@ -700,7 +701,8 @@ Let's start with the Loan Issuance flow:
"Loan\nIssuance"->"Fraud\nDetection": send a pull request\nwith the\nsuggested contracts
----
*Start doing TDD by writing a test for your feature.*
[[getting-started-cdc-consumer-start]]
==== Start doing TDD by writing a test for your feature
[source,groovy,indent=0]
----
@@ -710,7 +712,8 @@ include::{introduction_url}/samples/standalone/dsl/http-client/src/test/java/com
Assume that you have written a test of your new feature. If a loan application for a big
amount is received, the system should reject that loan application with some description.
*Write the missing implementation.*
[[getting-started-cdc-consumer-write]]
==== Write the missing implementation
At some point in time, you need to send a request to the Fraud Detection service. Assume
that you need to send the request containing the ID of the client and the amount the
@@ -727,7 +730,8 @@ application runs on `8090`.
If you start the test at this point, it breaks, because no service currently runs on port
`8080`.
*Clone the Fraud Detection service repository locally.*
[[getting-started-cdc-consumer-clone]]
==== Clone the Fraud Detection service repository locally
You can start by playing around with the server side contract. To do so, you must first
clone it.
@@ -737,7 +741,8 @@ clone it.
$ git clone https://your-git-server.com/server-side.git local-http-server-repo
----
*Define the contract locally in the repo of Fraud Detection service.*
[[getting-started-cdc-consumer-define]]
==== Define the contract locally in the repo of Fraud Detection service
As a consumer, you need to define what exactly you want to achieve. You need to formulate
your expectations. To do so, write the following contract:
@@ -766,9 +771,7 @@ Contract lets you define parts of a JSON block, a URL, etc., which are dynamic.
of an identifier or a timestamp, you need not hardcode a value. You want to allow some
different ranges of values. To enable ranges of values, you can set regular expressions
matching those values for the consumer side. You can provide the body by means of either
a map notation or String with interpolations.
//TODO: Ensure that the links are correct
Consult the <<contract-dsl>> section for more information. We highly recommend using the map notation!
a map notation or String with interpolations. We highly recommend using the map notation!
TIP: You must understand the map notation in order to set up contracts. Please read the
https://groovy-lang.org/json.html[Groovy docs regarding JSON].
@@ -789,7 +792,8 @@ the `rejectionReason` field having value `Amount too high`,
Once you are ready to check the API in practice in the integration tests, you need to
install the stubs locally.
*Add the Spring Cloud Contract Verifier plugin.*
[[getting-started-cdc-consumer-add]]
==== Add the Spring Cloud Contract Verifier plugin
We can add either a Maven or a Gradle plugin. In this example, you see how to add Maven.
First, add the `Spring Cloud Contract` BOM.
@@ -849,7 +853,8 @@ The following line is extremely important:
It confirms that the stubs of the `http-server` have been installed in the local
repository.
*Run the integration tests.*
[[getting-started-cdc-consumer-run]]
==== Run the integration tests
In order to profit from the Spring Cloud Contract Stub Runner functionality of automatic
stub downloading, you must do the following in your consumer side project (`Loan
@@ -896,7 +901,8 @@ This output means that Stub Runner has found your stubs and started a server for
with group id `com.example`, artifact id `http-server` with version `0.0.1-SNAPSHOT` of
the stubs and with `stubs` classifier on port `8080`.
*File a pull request.*
[[getting-started-cdc-consumer-file]]
==== File a pull request
What you have done until now is an iterative process. You can play around with the
contract, install it locally, and work on the consumer side until the contract works as
@@ -905,6 +911,7 @@ you wish.
Once you are satisfied with the results and the test passes, publish a pull request to
the server side. Currently, the consumer side work is done.
[[getting-started-cdc-producer]]
=== Producer side (Fraud Detection server)
As a developer of the Fraud Detection server (a server to the Loan Issuance service) we would like to:
@@ -935,7 +942,8 @@ Let's look at the Fraud Detection flow:
"CI"->"Stub Storage": build successful,\nupload artifacts
----
*Take over the pull request.*
[[getting-started-cdc-producer-pr]]
==== Take over the pull request
As a reminder, you can see the initial implementation here:
@@ -1029,7 +1037,8 @@ headers, and body defined in the contract. It also is expecting precisely define
in the response. In other words, you have the `red` part of `red`, `green`, and
`refactor`. It is time to convert the `red` into the `green`.
*Write the missing implementation.*
[[getting-started-cdc-producer-impl]]
==== Write the missing implementation
Because you know the expected input and expected output, you can write the missing
implementation:
@@ -1046,7 +1055,8 @@ When you execute `./mvnw clean install` again, the tests pass. Since the `Spring
Contract Verifier` plugin adds the tests to the `generated-test-sources`, you can
actually run those tests from your IDE.
*Deploy your app.*
[[getting-started-cdc-producer-deploy]]
==== Deploy your app
Once you finish your work, you can deploy your change. First, merge the branch:
@@ -1060,6 +1070,7 @@ $ git push origin master
Your CI might run something like `./mvnw clean deploy`, which would publish both the
application and the stub artifacts.
[[getting-started-cdc-consumer-final]]
=== Consumer Side (Loan Issuance) Final Step
As a developer of the Loan Issuance service (a consumer of the Fraud Detection server) we will want to:
@@ -1067,8 +1078,7 @@ As a developer of the Loan Issuance service (a consumer of the Fraud Detection s
- merge our feature branch to `master`
- switch to online mode of working
[plantuml, getting-started-cdc-client, png]
[plantuml, getting-started-cdc-client-final, png]
----
"Loan\nIssuance"->"Loan\nIssuance": merge the\nfeature branch\nto master branch
"Loan\nIssuance"->"Loan\nIssuance": setup SCC Stub Runner\nto fetch stubs\nfrom Stub Storage
@@ -1084,7 +1094,8 @@ As a developer of the Loan Issuance service (a consumer of the Fraud Detection s
"Loan\nIssuance"->"Loan\nIssuance": the test passes successfully
----
*Merge branch to master.*
[[getting-started-cdc-consumer-final-merge]]
==== Merge branch to master
[source,bash,indent=0]
----
@@ -1092,7 +1103,8 @@ $ git checkout master
$ git merge --no-ff contract-change-pr
----
*Work online.*
[[getting-started-cdc-consumer-final-online]]
==== Work online
Now you can disable the offline work for Spring Cloud Contract Stub Runner and indicate
where the repository with your stubs is located. At this moment the stubs of the server
@@ -1116,11 +1128,10 @@ https://spring.io/guides/[getting started] guides that solve specific "`How do I
with Spring?`" problems. We also have {project-full-name}-specific
"`<<howto.adoc#howto, How-to>>`" reference documentation.
Otherwise, the next logical step is to read _<<using.adoc#using>>_. If
Otherwise, the next logical step is to read _<<using.adoc#using, Using {project-full-name}>>_. If
you are really impatient, you could also jump ahead and read about
_<<project-features.adoc#project-features, {project-full-name} features>>_.
// TODO: Check if we can link courses
In addition to that you can check out the following videos:
- "Consumer Driven Contracts and Your Microservice Architecture" by Olga Maciaszek-Sharma and Marcin Grzejszczak

View File

@@ -32,8 +32,7 @@ Spring Cloud Contract Verifier stand out on the "market" of Consumer Driven Cont
[[how-to-not-write-contracts-in-groovy]]
== How can I write contracts in a language different than Groovy?
// TODO: Add a link
No problem. You can write a contract in YAML! Check this section for more information
No problem. You can write a contract in YAML! Check <<project-features.adoc#contract-dsl, this section>> for more information.
We are working on allowing more ways of describing the contracts. You can check the {github-issues}[github-issues] for more information.
@@ -125,8 +124,7 @@ How can you then provide one time a matcher for the consumer and a concrete valu
In Spring Cloud Contract we're allowing you to provide a *dynamic value*. That means that it can differ for both
sides of the communication.
// TODO: Ensure that the link is correct
You can read more about this in the <<contract-dsl>> section.
You can read more about this in the <<project-features.adoc#contract-dsl, Contract DSL>> section.
IMPORTANT: Please read the https://groovy-lang.org/json.html[Groovy docs related to JSON] to understand how to
properly structure the request / response bodies.

View File

@@ -9,8 +9,8 @@ The reference documentation consists of the following sections:
[horizontal]
<<legal.adoc#legal-information,Legal>> :: Legal information.
<<documentation-overview.adoc#contract-documentation,Documentation Overview>> :: About the Documentation, Getting Help, First Steps, and more.
<<getting-started.adoc#getting-started,Getting Started>> :: Introducing {project-full-name}, System Requirements, Developing Your First {project-full-name} based Application
<<getting-started.adoc#getting-started,Getting Started>> :: Introducing {project-full-name}, Developing Your First {project-full-name} based Application
<<using.adoc#using,Using {project-full-name}>> :: {project-full-name} usage examples and workflows
<<project-features.adoc#features,{project-full-name} Features>> :: Profiles, Logging, Security, Caching, Spring Integration, Testing, and more.W
<<project-features.adoc#features,{project-full-name} Features>> :: Contract DSL, Messaging, Spring Cloud Contract Stub Runner, Spring Cloud Contract WireMock
<<project-features.adoc#features-build-tools,Build Tools>> :: Maven Plugin, Gradle Plugin, Docker
<<howto.adoc#howto,"`How-to`" Guides>> :: Stubs versioning, Pact integration, Debugging, and more.

View File

@@ -3,8 +3,8 @@
include::_attributes.adoc[]
This section goes into more detail about how you should use {project-full-name}. It covers topics
such as description of flows of how to work with {{project-full-name}}. We also
cover some {{project-full-name}} best practices.
such as description of flows of how to work with {project-full-name}. We also
cover some {project-full-name} best practices.
If you are starting out with {project-full-name}, you should probably read the
_<<getting-started.adoc#getting-started, Getting Started>>_ guide before diving into this
@@ -778,4 +778,4 @@ Since the consumer flow isn't affected by the tool used to generate the stubs, y
You should now understand how you can use {project-full-name} and some best practices that you
should follow. You can now go on to learn about specific
_<<project-features#project-features, {project-full-name} features>>_ in depth, or you could
skip ahead and read about the ...
skip ahead and read about the _link:advanced.html[advanced features of {project-full-name}]_.