Pregunta

Estoy intentando escribir una prueba unitaria para el manejo de un controlador de carga de archivos utilizando Spring 3. Ahora bien, si puedo enviar la imagen a mi método de servicio a través del controlador todo funciona bien. Pero cuando se hace una unidad de prueba recta Me estoy haciendo una excepción de puntero nulo.

Parece que la propiedad "ODFs" dentro de la DiskFilteItem es nula cuando instanciar forma manual, pero que se llena cuando la recuperación de un MultipartFile desde el controlador.

    File file = new File("//Users//test//Downloads//testimage.jpg");
    log.info("found file: " +file.exists());
    log.info("file size: " +file.length());
    String fieldName = "field";
    String contentType = "image/jpeg";
    boolean isFormField = false;
    String fileName = "testimage.jpg";
    int sizeThreshold = 10240;

    DiskFileItemFactory factory = new DiskFileItemFactory();

    DiskFileItemFactory factory = new DiskFileItemFactory();
    // throws null pointer
    FileItem fi = factory.createItem(fieldName,contentType,isFormField,fileName);

    // so does this one
    DiskFileItem item = new DiskFileItem(fieldName, contentType, isFormField, fileName, sizeThreshold, file);
    MultipartFile f = new CommonsMultipartFile(item);

siento que me falta algo tonto en mi configuración. Mi archivo POM contiene las siguientes dependencias.

    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.2.2</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.0</version>
    </dependency>

Este código lanza el seguimiento de la pila siguiente

java.lang.NullPointerException
 at org.apache.commons.fileupload.disk.DiskFileItem.getSize(DiskFileItem.java:316)
 at org.springframework.web.multipart.commons.CommonsMultipartFile.(CommonsMultipartFile.java:60)
 at ImgurClientTest.testUploadImage(ImgurClientTest.java:58)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
 at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
 at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
 at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
 at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
 at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
 at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
 at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
 at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
 at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
 at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
 at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
 at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
 at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
 at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
 at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
 at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:65)
¿Fue útil?

Solución

me encontré con el mismo problema. La cuestión es que DiskFileItem.getSize() se acopla temporalmente con DiskFileItem.getOutputStream() en que un campo interno se inicializa en getOutputStream y se utiliza en getSize.

La solución es hacer

final File TEST_FILE = new File("src/test/resources/test.jpg");
final DiskFileItem diskFileItem = new DiskFileItem("file", "image/jpeg", true, TEST_FILE.getName(), 100000000, TEST_FILE.getParentFile());
diskFileItem.getOutputStream();

antes de pasar diskFileItem al constructor de CommonsMultipartFile.

Otros consejos

¿Qué significa esta parte de este ejemplo de registro?

log.info("found file: " +file.exists());
log.info("file size: " +file.length());

Sin embargo, creo que el problema podría ser debido a esto:

File file = new File("//Users//test//Downloads//");

Parece que está apuntando a un directorio en lugar de un archivo, por lo que quizás es por eso que está recibiendo un NullPointerException cuando se quiere obtener el tamaño de DiskFileItem

Y si ninguna de las soluciones anteriores trabajos para usted, ya que pasó por mí :) simplemente deshacerse de la DiskFileItem y utilizar la solución de abajo:

  final File fileToUpload = new File("src/test/resources/files/test.txt");
  final MultiValueMap<String, Object> request = new LinkedMultiValueMap<String, Object>();
  request.add("file", new FileSystemResource(fileToUpload.getAbsolutePath()));

Aunque no del todo relacionada con la pregunta. Me encontré con la misma excepción al implementar un código de carga de archivos a GAE. He modificado el código del systempuntoout de aquí usando Apache fileupload en GAE (que utiliza las corrientes de parte de apache commons) que entonces funcionaba bien.

new DiskFileItem(fieldName, contentType, isFormField, fileName, sizeThreshold, file);

resultado en un valor null. Mire en el interior docs para ver lo que hay mal o tal vez se pasa un poco de null como parámetros

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top