2010-11-08 6 views
4

J'essaye d'écrire un test unitaire pour manipuler un contrôleur de téléchargement de fichier en utilisant Spring 3. Maintenant, si je renvoie l'image à ma méthode de service via le contrôleur, tout fonctionne correctement. Mais quand je fais un test d'unité, je reçois une exception de pointeur nul.java.lang.NullPointerException lors de la création de DiskFileItem

Il semble que la propriété "dfos" à l'intérieur du DiskFilteItem est nulle lorsque je l'instancie manuellement mais qu'elle est remplie lors de la récupération d'un MultipartFile à partir du contrôleur. Je sens qu'il me manque quelque chose d'idiot dans ma configuration. Mon fichier pom contient les dépendances suivantes.

<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> 

Ce code jette la trace de la pile suivante

 
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) 

Répondre

6

J'ai rencontré le même problème. Le problème est que DiskFileItem.getSize() est temporellement couplé avec DiskFileItem.getOutputStream() en ce qu'un champ interne est initialisé en getOutputStream et utilisé en getSize.

La solution est de faire

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(); 

avant de passer diskFileItem au constructeur de CommonsMultipartFile.

0

Qu'est-ce que cette partie de ce journal dire?

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

Mais je pense que le problème pourrait être à cause de cela:

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

On dirait qu'il pointe vers un répertoire au lieu d'un fichier, alors peut-être c'est la raison pour laquelle vous obtenez un NullPointerException lorsque vous veulent obtenir la taille de DiskFileItem

+0

Vous avez raison qui était une faute de frappe dans la description, j'ai modifié l'échantillon original pour pointer vers un fichier. Les entrées du fichier journal sont les suivantes: 2010-11-08 11: 57: 11,907 [principal] INFO ClientTest - fichier trouvé: true 2010-11-08 11: 57: 11,908 [principal] INFO ClientTest - taille de fichier : 291812 –

+0

Si cela résout votre problème, s'il vous plaît upvote et marquer comme réponse. J'apprécie beaucoup. –

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

donne une valeur null. Regardez dans le docs pour voir ce qui ne va pas ou peut-être vous passez certains null comme paramètres

+0

Non toutes les valeurs sont remplies avec quelque chose, il semble être comment je crée le DiskFileItem à partir de zéro vs comment Spring le crée lors de l'envoi d'un contrôleur. En passant par le code DiskFileItem, il semble qu'il manque une instanciation quelque part en le faisant manuellement pour le paramètre dfos. –

0

Et si aucune des solutions ci-dessus travail pour vous comme il est arrivé pour moi :) simplement le fossé DiskFileItem et utiliser la solution ci-dessous:

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())); 
0

Bien que pas tout à fait lié à la question. J'ai rencontré la même exception lors du déploiement d'un code de téléchargement de fichier vers GAE. J'ai modifié le code de systempuntoout d'ici using apache fileupload on GAE (qui utilise la partie des flux de communs Apache) qui a ensuite bien fonctionné.

Questions connexes