2016-04-11 7 views
1

私は、テストを修正しようとしているサークルでラウンドラウンドしていますが、SOや他のオンラインソースでは解決策がありません。私はあるMyException例外を処理するために、この@ControllerAdvice方法があります:@ExceptionHandlerが呼び出されていないtest

@ControllerAdvice 
public class MyControllerAdvice { 
    @ExceptionHandler(MyException.class) 
    @ResponseBody 
    public HttpEntity<ErrorDetail> handleMyException(MyException exception) { 
     return new ResponseEntity<>(exception.getErrorDetail(), exception.getHttpStatus(); 
    } 
} 

をそして私は、コントローラを持っている:

によってテストされ
@Controller 
@RequestMapping(value = "/image") 
public class ImageController { 
    @Autowired 
    private MyImageService imageService; 

    @RequestMapping(value = "/{IMG_ID}", method = RequestMethod.GET, 
     produces = MediaType.IMAGE_PNG_VALUE) 
    public HttpEntity<?> getImage(String imageId) { 
     byte[] imageBytes = imageService.findOne(imageId); // Exception thrown here 
     .... 
     return new ResponseEntity<>(imageBytes, HttpStatus.OK); 
    } 
    ... 
} 

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = MyApplication.class) 
@WebAppConfiguration 
@IntegrationTest("server.port:0") 
public class ThumbnailControllerTest { 
    @Autowired 
    private ImageController testObject; 
    private ImageService mockImageService = mock(ImageService.class); 

    @Autowired 
    protected WebApplicationContext webApplicationContext; 
    private MockMvc mockMvc; 

    @Before 
    public void setup() { 
     testObject.setImageService(mockImageService); 
     mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
    } 

    @Test 
    public void testImageWhichDoesntExistReturns404() { 
      doThrow(new MyException("Doesn't exist", HttpStatus.NOT_FOUND)) 
       .when(mockImageService).findOne(anyString()); 

      mockMvc.perform(get("/image/doesnt_exist")) 
       .andExpect(status().isNotFound()); 
    } 
} 

私は同様のセットアップを持っています他のテストでは、これらは合格と思われます。しかし、これについて私は得る:Failed to invoke @ExceptionHandler method: public org.springframework.http.HttpEntity<mypackage.ErrorDetail>しかし、私はそれが呼び出されたときにそれが呼び出され、ログが検出されたことを示すので(Detected @ExceptionHandler methods in MyControllerAdvice)それが呼び出されることを知っている。

これは、HttpMessageConvertersが正しく解決されず、必要なJSON形式ではなくModelAndViewアプローチを使用して出力を解決しようとしているからです。私は、ControllerAdviceとHttpMessageConvertersが設定されたMockMvcにstandaloneSetupを使用するか、または必要なタイプのHttpMessageConverters Beanを使用して強制的に強制することができませんでした。

私は春の依存関係を使用しています:私は間違って

org.springframework.boot:spring-boot-starter-web:jar:1.3.1.RELEASE 
org.springframework.boot:spring-boot-starter:jar:1.3.1.RELEASE 
org.springframework.boot:spring-boot-starter-test:jar:1.3.1.RELEASE 
org.springframework.boot:spring-boot-starter-data-rest:jar:1.3.1.RELEASE 

何をしているのですか?

答えて

1

私はproduces = MediaType.IMAGE_PNG_VALUEにこれを追跡できました。それを削除すると、正常に動作します(ErrorDetailがJSON直列化可能であると仮定します)。問題は、AbstractMessageConverterMethodProcessorが要求されたタイプに固執することです。 image/pngを生成できないため、JSONコンバータをスキップするだけです。 produces = {MediaType.IMAGE_PNG_VALUE, MediaType.APPLICATION_JSON_VALUE}を指定すると、が最初にタイプになり、それに固執します。

producesと動作させる方法を理解できませんでした。改善や修正は歓迎します。

+0

多くの助けになりましたが、問題を解決した 'produce'とは対照的に、うまく動作するレスポンスにヘッダーとしてコンテンツタイプを指定しました。 – joelc

関連する問題