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