How to send a multipart request with RestAssured?
Solution 1
Your code looks fine and it should work with byte[]. You can use MultiPartSpecBuilder(byte[] content)
like below.
private MultiPartSpecification getMultiPart() {
return new MultiPartSpecBuilder("Test-Content-In-File".getBytes()).
fileName("book.txt").
controlName("file").
mimeType("text/plain").
build();
}
The details for error you are getting with byte[] is available at https://github.com/rest-assured/rest-assured/issues/507. According to this you should try with preemptive basic auth like below.
.auth().preemptive.basic("admin", "admin")
Solution 2
try {
RestAssured.given()
.header(new Header("content-type", "multipart/form-data"))
.multiPart("file",new File( "./src/main/resources/test.txt"))
.formParam("description", "This is my doc")
.auth().preemptive().basic(loginModel.getUsername(), loginModel.getPassword())
.when()
.post(URL)
.then()
.assertThat()
.body(matchesJsonSchemaInClasspath("schemas/members/member-document.json"));
}
catch(Exception e) {
Assert.assertEquals(false, true);
logger.error(e.getMessage(), e);
}
Łukasz Chorąży
Over 7 years of commercial experience as a developer and adept of software engineering craft. I am writing code and tests, defining acceptance criteria and performing code review on a daily basis, setting for myself the highest standards I can. I work on improving my skills by reading books and articles and visiting conferences.
Updated on June 19, 2022Comments
-
Łukasz Chorąży over 1 year
I have
@Controller
with method with signature like this:@PostMapping @ResponseBody public ResponseEntity<Result> uploadFileAndReturnJson(@RequestParam("file") MultipartFile file) {}
I want to construct multipart request without physically creating any file. I tried doing it like this:
private MultiPartSpecification getMultiPart() { return new MultiPartSpecBuilder("111,222") .mimeType(MimeTypeUtils.MULTIPART_FORM_DATA.toString()) .controlName("file") .fileName("file") .build(); } Response response = RestAssured.given(this.spec) .auth().basic("admin", "admin") .multiPart(getMultiPart()) .when().post(URL);
Unfortunately I received response:
Required request part 'file' is not present
I tried looking at RestAssured unit tests and it seems I'm doing it correctly. If I try to pass byte[] or InputStream instead of String, an exception is thrown:
Cannot retry request with a non-repeatable request entity.
Thanks for help.