6

Spring 3を使用してファイルアップロードコントローラーを処理するための単体テストを作成しようとしています。コントローラーを介してイメージをサービスメソッドに送信すると、すべて正常に機能します。しかし、ストレートユニットテストを実行すると、nullポインター例外が発生します。

DiskFilteItem手動でインスタンス化すると、内のプロパティ「dfos」はnullのように見えますがMultipartFile、コントローラーからを取得すると入力されます。

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

セットアップに何かばかげたものが欠けているような気がします。私のpomファイルには次の依存関係が含まれています。

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

このコードは、次のスタックトレースをスローします

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

5 に答える 5

14

私は同じ問題に遭遇しました。問題は、内部フィールドが で初期化され、 で使用されるという点で、DiskFileItem.getSize()が時間的に結合されていることです。DiskFileItem.getOutputStream()getOutputStreamgetSize

解決策はすることです

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

diskFileItemのコンストラクタに渡す前にCommonsMultipartFile

于 2011-03-30T16:00:34.617 に答える
0

そして、上記の解決策のいずれも私に起こったようにうまくいかない場合:)単にDiskFileItemを捨てて、以下の解決策を使用してください。

  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()));
于 2013-07-19T11:16:52.313 に答える
0

このログのこの部分は何を示していますか?

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

しかし、問題はこれが原因である可能性があると思います:

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

NullPointerExceptionファイルではなくディレクトリを指しているように見えるので、サイズを取得したいときに取得しているのかもしれませんDiskFileItem

于 2010-11-08T02:16:05.400 に答える
-1
new DiskFileItem(fieldName, contentType, isFormField, fileName, sizeThreshold, file);

値になりnullます。ドキュメントを調べnullて何が問題なのかを確認するか、パラメーターとしていくつかを渡します

于 2010-11-08T09:18:21.247 に答える