2016-04-11 38 views
1

Bir sınayi düzeltmeye çalışan daireler içinde yuvarlak ve yuvarlak gidiyordum ve SO ya da diğer çevrimiçi kaynaklarda hiçbir şey bir çözüm sağlamıyor. Ben ise MyException İstisna işlemek için bu @ControllerAdvice yöntemi vardır:@ExceptionHandler çalıştırılmadı test

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

Ve ben bir denetleyici var:

@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); 
    } 
    ... 
} 

tarafından test edilmiştir:

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

Ben benzer bir kurulum var Diğer testler için ama bunlar geçiyor gibi görünüyor. Ancak bunun için şunu aldım: Failed to invoke @ExceptionHandler method: public org.springframework.http.HttpEntity<mypackage.ErrorDetail> ancak çağrıldığını biliyorum çünkü adıma girdiğimde ve günlükler algılandığını gösteriyor ( Detected @ExceptionHandler methods in MyControllerAdvice).

Düşüncelerimin nedeni, HttpMessageConverters öğesinin doğru şekilde çözümlenmemesi ve çıktıyı, gerekli JSON biçimini değil, bir ModelAndView yaklaşımı kullanarak çözmesidir. Bunu, MockMvc için (ControllerAdvice ve HttpMessageConverters kümesi ile yapılandırılmış) standaloneSetup'u kullanarak ya da gerekli türde bir HttpMessageConverters çekirdeği kullanarak zorlayarak zorlayamadım.

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 

yanlış yapıyorum:

Bahar bağımlılıkları kullanıyorum?

cevap

1

Bunu izleyebildim produces = MediaType.IMAGE_PNG_VALUE. Bunu kaldırırsanız, iyi çalışır (ErrorDetail'nızın JSON serileştirilebilir olduğunu varsayarak). Şey, AbstractMessageConverterMethodProcessor talep edilen tipte yapışıyor. JSON dönüştürücüyü atlar çünkü görüntü/png üretemez. produces = {MediaType.IMAGE_PNG_VALUE, MediaType.APPLICATION_JSON_VALUE}'un belirtilmesi, aşağıdakilere yardımcı olmaz: yalnızca ilk türünü seçip yapışır.

produces ile nasıl çalışacağını anlayamadım. Herhangi bir iyileştirme veya düzeltme kabul edilir.

+0

Çok yardımcı oldugunuz için, içerik türünü, sorunun çözülmesine yol açan "ürünler" in tersine iyi sonuç veren yanıt üzerinde bir başlık olarak belirledim. – joelc