2016-04-11 11 views
1

Ich bin im Kreis herumgegangen und habe versucht, einen Test zu reparieren und nichts auf SO oder anderen Onlinequellen hat eine Lösung zur Verfügung gestellt. Ich habe diese @ControllerAdvice Methode, um die MyException Ausnahme zu behandeln, die ist:@ExceptionHandler wird nicht aufgerufen Test

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

Und ich habe einen Controller:

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

die durch getestet:

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

Ich habe ein ähnliches Setup für andere Tests, aber diese scheinen zu bestehen. Jedoch für diesen einen bekomme ich: Failed to invoke @ExceptionHandler method: public org.springframework.http.HttpEntity<mypackage.ErrorDetail> jedoch weiß ich, dass es aufgerufen wird, weil, wenn ich durchgehe, es aufgerufen wird und die Protokolle zeigen, dass es erkannt wurde (Detected @ExceptionHandler methods in MyControllerAdvice).

Meine Gedanken sind, dass dies liegt daran, dass die HttpMessageConverter nicht korrekt aufgelöst werden und versuchen, die Ausgabe mithilfe einer ModelAndView-Ansatz und nicht das erforderliche JSON-Format aufzulösen. Ich konnte das nicht erzwingen, indem ich standaloneSetup für das MockMvc (das mit dem ControllerAdvice- und dem HttpMessageConverters-Set konfiguriert wird) oder erzwungene es unter Verwendung eines HttpMessageConverters Bean des erforderlichen Typen erzwang.

Ich bin mit der Feder Abhängigkeiten:

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 

Was mache ich falsch?

Antwort

1

Ich konnte dies bis produces = MediaType.IMAGE_PNG_VALUE verfolgen. Wenn Sie das entfernen, funktioniert es einwandfrei (vorausgesetzt, ErrorDetail ist JSON-serialisierbar). Die Sache ist, AbstractMessageConverterMethodProcessor Sticks mit dem angeforderten Typ. Es überspringt einfach den JSON-Konverter, weil es kein image/png erzeugen kann. Das Spezifizieren produces = {MediaType.IMAGE_PNG_VALUE, MediaType.APPLICATION_JSON_VALUE} hilft auch nicht: es wählt nur den ersten Typ aus und bleibt dabei.

Ich konnte nicht herausfinden, wie man es mit produces arbeiten lassen. Verbesserungen oder Korrekturen sind willkommen.

+0

Vielen Dank, das hat mir sehr geholfen, ich habe den Inhaltstyp als Überschrift auf die Antwort angegeben, die gut funktioniert im Gegensatz zu den 'products', die das Problem gelöst hat. – joelc

Verwandte Themen