Как создать объект CommonsMultipartFile, если задан только файл

У меня есть метод проверки junit, который принимает объект CommonsMultipartFile в качестве параметра.

Я пытаюсь создать объект FileItem, чтобы передать его конструктору,

CommonsMultipartFile(org.apache.commons.fileupload.FileItem fileItem)

Чтобы сделать это, я пытаюсь создать объект FileItem с помощью конструктора DiskFileItem,

DiskFileItem(java.lang.String fieldName, java.lang.String contentType, boolean isFormField, java.lang.String fileName, int sizeThreshold, java.io.File repository)

но я не уверен, как передать любой из этих параметров.

У меня все это работает в контроллере Spring 3 MVC, но для выполнения моих тестов junit мне нужно передать метод двум объектам. Одним из них является объект UploadItem, который выглядит следующим образом:

import org.springframework.web.multipart.commons.CommonsMultipartFile;

public class UploadItem {
 private String fileName;
 private String filePath;
 private CommonsMultipartFile fileData;

 public String getFileName() {
  return fileName;
 }

 public void setFileName(String fileName) {
  this.fileName = fileName;
 }

 public String getFilePath() {
  return filePath;
 }

 public void setFilePath(String filePath) {
  this.filePath = filePath;
 }

 public CommonsMultipartFile getFileData() {
  return fileData;
 }

 public void setFileData(CommonsMultipartFile fileData) {
  this.fileData = fileData;
 }
}

Для метода setFileData() требуется объект CommonsMultipartFile, который я пытаюсь создать только заданный файл в каталоге src/test/resources.

Кто-нибудь знает, как я могу взять файл, создать объект FileItem и передать его конструктору объектов CommonsMultipartFile?

Спасибо. Если что-то неясно, сообщите мне - я не знаком с загрузкой файлов MVC Spring.

Ответ 1

Используйте более общий интерфейс org.springframework.web.multipart.MultipartFile. вместо org.springframework.web.multipart.commons.CommonsMultipartFile в вашей команде (UploadItem). (CommonsMultipartFile - реализация интерфейса 1:1).

Теперь вы можете создать экземпляр CommonsMultipartFile с классом mock org.springframework.mock.web.MockMultipartFile. (который является элементом spring-test.jar).

Тогда создание MultipartFile в тестах - это только один оператор без каких-либо изменений:

MockMultipartFile mockMultipartFile = new MockMultipartFile(
       "test.txt",                //filename
       "Hallo World".getBytes()); //content

Ответ 2

Как это может помочь? вы не устанавливаете файл в запросе, его следует использовать следующим образом:

MultipartFile multipartFile = getMockCommonsMultipartFile(BULK_CSV);
MockMultipartHttpServletRequest request = new MockMultipartHttpServletRequest();
request.addFile(multipartFile);
CommonsMultipartFile commonsMultipartFile = (CommonsMultipartFile) request.getFile(BULK_CSV);

Я использую метод с аргументом CommonsMultipartFile, иначе я мог бы напрямую использовать MockMultipartFile.

 private MultipartFile getMockCommonsMultipartFile(String name, String path) throws IOException {
        InputStream is = getClass().getResourceAsStream(path);
        MultipartFile multipartFile = new MockMultipartFile(name, name, "", is);
        return multipartFile;
    }