Issue
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.
Solution
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")
Answered By - abaghel
Answer Checked By - Katrina (JavaFixing Volunteer)