У меня есть следующая конечная точка POST внутри моего проекта Quarkus:
@PUT
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("{var}/some-def")
public Response saveReportDefinition(
@PathParam("var")
String var,
@NotNull
@Valid
FileUploadInput fileInput,
@Context
UriInfo uriInfo
) {
return Response.ok().build();
}
где мой FileUploadInput выглядит так:
import org.jboss.resteasy.reactive.multipart.FileUpload;
public record FileUploadInput(
@NotNull
@RestForm("file1")
FileUpload file1,
@NotNull
@RestForm("file2")
FileUpload file2,
@NotNull
@RestForm("file3")
FileUpload file3
) {}
У меня есть следующий метод тестирования с платформой RestAssured:
@Test
@DisplayName("Test Upload")
public void testUpload() {
// 1. Prepare test data
File file1 = getResourceAsFile("/dir/file1.json");
File file2 = getResourceAsFile("/dir/file2.txt");
File file3 = getResourceAsFile("/dir/file3.sql");
// 2. Construct the request
Response response = given()
.contentType(ContentType.MULTIPART)
.multiPart(?????)
.put(BASE_URL + "Commission/report-definition");
// 3. Validate the response
response.then()
.statusCode(200) // Expecting a successful response (HTTP 200)
.body(is(emptyOrNullString())); // Assuming empty or null response body
}
Как теперь написать правильный тест с обновленной структурой для такой конечной точки?
В самом репозитории Quarkus такие тесты есть.
аналогичный пример делает что-то вроде этого:
RestAssured.given()
.multiPart("name", "Alice")
.multiPart("active", "true")
.multiPart("num", "25")
.multiPart("status", "WORKING")
.multiPart("htmlFile", HTML, "text/html")
.multiPart("xmlFile", XML, "text/xml")
.multiPart("txtFile", TXT, "text/plain")
.accept("text/plain")
.when()
.post("/multipart/simple/2")
.then()
.statusCode(200)
.body(equalTo("Alice - true - 50 - WORKING - true - true - true"));
У нас есть открытый вопрос по поддержке записей
Ага, я знаю, что это, вероятно, глупый вопрос, но есть ли какой-то общий способ получить подсказку об ошибках, если функциональность/фреймворк не поддерживает запись.
Совсем не глупо :). Попробуйте установить quarkus.log.category."org.jboss.resteasy.reactive.server.handlers.ParameterHandler".level=DEBUG
или, если это не сработает, quarkus.log.category."org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext".level=DEBUG
Я написал следующий тест в соответствии с инструкциями @geoand (спасибо за ответ), который не удался.
@Test
@DisplayName("Test Upload")
public void testUpload() {
// 1. Prepare test data
File file1 = getResourceAsFile("/dir/file1.json");
File file2 = getResourceAsFile("/dir/file2.txt");
File file3 = getResourceAsFile("/dir/file3.sql");
// 2. Construct the request
Response response = given()
.contentType(ContentType.MULTIPART)
.multiPart("metaFile", file1, MediaType.TEXT_PLAIN)
.multiPart("jsonFile", file2, MediaType.APPLICATION_JSON)
.multiPart("sqlFile", file3, MediaType.TEXT_PLAIN)
.put(BASE_URL + "Commission/report-definition");
// 3. Validate the response
response.then()
.statusCode(200) // Expecting a successful response (HTTP 200)
.body(is(emptyOrNullString())); // Assuming empty or null response body
}
но если бы я реализовал saveReportDefinition()
без записи типа
@PUT
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("{var}/some-def")
public Response saveReportDefinition(
@PathParam("var")
String var,
@NotNull
@RestForm("file1")
FileUpload file1,
@NotNull
@RestForm("file2")
FileUpload file2,
@NotNull
@RestForm("file3")
FileUpload file3
@Context
UriInfo uriInfo
) {
return Response.ok().build();
}
тогда все работало. Тогда я попробовал смоделировать FileUploadInput
классно, а не рекордно, как раньше.
import org.jboss.resteasy.reactive.multipart.FileUpload;
public class FileUploadInput {
@NotNull
@RestForm("file1")
public FileUpload file1,
@NotNull
@RestForm("file2")
public FileUpload file2,
@NotNull
@RestForm("file3")
public FileUpload file3
}
и затем автоматически тест начал работать. Не знаю, почему в тестировании не работают записи. Я использую Quarkus v. 3.8.4 с Java 17 Temurin.
Спасибо за ваш ответ, это помогло мне написать тест. Но это не решило мою проблему, которая уже существовала. Смотрите ниже мой ответ (stackoverflow.com/a/78617134/3193255). Возможно, вы знаете, почему записи не работают, а классы работают, если вы агрегируете входные параметры внутри конечных точек покоя?