How to send a multipart request with RestAssured?

14,091

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);
}
Share:
14,091
Łukasz Chorąży
Author by

Ł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, 2022

Comments

  • Łukasz Chorąży
    Ł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.