rest-test-client
Companion project for the article RestTestClient in Spring Framework 7: One Client for Every Kind of REST Test on ankurm.com.
Every console block quoted in the article came out of docs/output/. These are real mvn test
and curl transcripts, not retyped output — including four real, captured failures (two
different ways to get TestRestTemplate wrong, one way to get RestTestClient wrong, and a
javap dump proving a real API gap) that are as much the point of the post as the passing tests
are.
There is deliberately no docs/NN-topic.md chapter folder: the deeper material lives in
collapsible "going deeper" sections inside the article itself, next to the paragraph each one
extends. docs/output/ (captured transcripts) is the one thing that still lives under docs/.
Versions
| Spring Boot | 4.1.1 |
| Spring Framework | 7.0.9 (GA 2025-11-13) |
| JDK | 25 (GraalVM CE 25.4.4.1.1) |
| Maven | 3.9 |
Quickstart
export JAVA_HOME=/path/to/jdk-25
mvn test # runs everything below; no Docker, no running server required to start it
What's demonstrated
| Area | Where |
|---|---|
bindToController: the fastest binding mode, no Spring context at all |
PersonControllerUnitTest.java |
bindTo(mockMvc) inside @WebMvcTest: real MVC dispatch, mocked collaborator |
PersonMockMvcSliceTest.java |
bindToApplicationContext: the full context, no server, plus the AssertJ-style RestTestClientResponse |
PersonApplicationContextTest.java |
bindToServer with @AutoConfigureRestTestClient: a real embedded Tomcat on a real port |
PersonEndToEndTest.java |
RestTestClient, TestRestTemplate, and @WebMvcTest all moved into new Spring Boot 4 modules — confirmed by unzipping the real jars |
pom.xml, docs/output/02, docs/output/03, docs/output/04 |
TestRestTemplate is not deprecated, just relocated and no longer free: @AutoConfigureTestRestTemplate migrates existing tests unchanged |
TestRestTemplateMigrationTest.java |
The default HTTP client Boot detects for bindToServer (java.net.http.HttpClient) transparently decodes gzip and hides Content-Encoding from you — a real surprise, verified against curl and against the older SimpleClientHttpRequestFactory |
PersonEndToEndTest.java, HttpClientChoiceComparisonTest.java |
RestTestClient genuinely has no multipart support yet — confirmed with javap against the real class files, not a blog post's claim |
docs/output/08-no-multipart-method-javap.txt |
Captured output
| File | What it shows |
|---|---|
01-full-test-run-passing.txt |
the real, full mvn clean test run: all 11 tests passing across 6 classes |
02-testresttemplate-missing-restclient-dependency.txt |
@AutoConfigureTestRestTemplate present, but spring-boot-starter-restclient missing: a NoClassDefFoundError on RestTemplateBuilder, not a clean "bean not found" |
03-resttestclient-not-autoconfigured.txt |
@AutoConfigureRestTestClient removed: a clean NoSuchBeanDefinitionException for RestTestClient |
04-testresttemplate-not-autoconfigured.txt |
@AutoConfigureTestRestTemplate removed (with the restclient starter present this time): the same clean failure shape, for TestRestTemplate |
05-curl-sees-real-gzip.txt |
direct curl against the running app: Tomcat really does send Content-Encoding: gzip |
06-resttestclient-hides-the-gzip.txt |
the same request through RestTestClient.bindToServer(): no Content-Encoding header at all |
07-simplefactory-shows-the-real-header.txt |
the same request again, through the older SimpleClientHttpRequestFactory: Content-Encoding: gzip is visible |
08-no-multipart-method-javap.txt |
javap against the real RestTestClient class files: no multipart() method anywhere in the chain |
Nothing here needs Docker or a pre-running server — mvn test starts and stops everything it
needs, including the one test class that opens a real socket.