2016-10-30 8 views
0

REST APIによるファイルのアップロードをテストしたいと思います。 RequestBodyの代わりにRequestParamというファイルを送信するのはかなり紛らわしいことが分かりました。テストファイルのアップロードSpring MVC

コントローラ方法:私はそれをテストしたいと私はモックを使用しました

@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) 
public 
@ResponseBody 
ResponseEntity<String> uploadFile(
     @RequestParam(name = "file") MultipartFile multipartFile, 
     @RequestParam(name = "path") String path) { 
    logger.debug("File upload REST requested"); 

    return new ResponseEntity<>(fileService.uploadFile(
      multipartFile, path), 
      HttpStatus.OK); 
} 

1.Now。それをデバッグしている間、モックサービスは動作していますが、この引数を使ったメソッドは呼び出されないので、テストは失敗します。どうすればこの問題を処理できますか?

@Test 
public void testUploadFile() throws Exception { 
    String mockName = "mock"; 
    MockMultipartFile mockMultipartFile = new MockMultipartFile(mockName, mockName.getBytes()); 

    when(mockFileService.uploadFile(mockMultipartFile, rootDir)).thenReturn("success"); 

    mockMvc.perform(MockMvcRequestBuilders.fileUpload("/files/upload") 
      .file("file", mockMultipartFile.getBytes()) 
      .param("path", rootDir)) 
      .andExpect(status().isOk()) 
      .andExpect(content().string("success")); 

    verify(mockFileService, times(1)).updateFile(mockMultipartFile, rootDir); 
    verifyNoMoreInteractions(mockFileService); 
} 

2.私は郵便配達員でこれをテストできますか?私はBodyでファイルを送ることができますが、どうすればそれをparamとして送ることができますか?

EDIT:

私は方法を変更したが、問題はありません。

Argument(s) are different! Wanted: 
mockFileService.uploadFile(
[email protected], 
"/" 
); 

は方法のように見えるMockMultipartFileの2つのインスタンスを使用しています。 2番目の質問はまだ開いていますが、この方法をPostmanからどのようにテストすることができますか?

+0

あなたがテストしたいメソッドへの実際の呼び出しを嘲笑してしまった、私はあなたが偽のファイルを欲しかったと信じていますか? – freakman

+0

@freakman私はファイルを嘲笑するのは良くないと読んだ。ここで私は実際にファイルをアップロードしないためにサービスを模擬したいので、実際のメソッド呼び出し – quento

+0

を模擬したいのですが、あなたはファイルを嘲笑してしまったので、ここでテストしたいのですか?これは現時点では何もテストしていません:)私が最初に推測したのは、mockMvcがmockFileServiceについて何も知らず、実際のメソッドを実行しようとしているということです。 'andDo(print())'を追加すると詳細が表示されます – freakman

答えて

0

はい、テストケースが失敗し、 問題は終わりにテストケースであるので、あなたはあなたのcontrollerあなたがuploadFileを()を使用しているのように間違っているupdateFile()の呼び出しを検証している、あなたが使用しなければなりません同じ方法をverifyにします。あなたが別の方法でverifyに電話をしようとしているよう回数は、メソッドが呼び出されるつまり

verify(mockFileService, times(1)). uploadFile(mockMultipartFile, rootDir); 

、Mockitoを確認し検証します。

だから、あなたは以下のようにverify行を変更する必要があります(コントローラーで使用されていない)、失敗しています。