El problema es que no puedo hacer una prueba unitaria/simular esto porque el mensaje ByLocaleService es nulo en el Consejo del controlador . Sugiera cualquier forma de inyectar el simulacro de messageByLocaleSer. Tengo una configuración como esta:
Clase ExceptionControllerAdvice:
@Autowired private MessageByLocaleService messageByLocaleService; //CANNOT MOCK THIS @ControllerAdvice public class ExceptionControllerAdvice { @ExceptionHandler(UserNotFoundException.class) public ResponseEntity<String> handleUnexpectedException(HttpServletRequest request, Exception e) { //build response as below String s = messageByLocaleService.buildMessage(HttpStatus.ERROR,"User Not Valid"); // GETTING NULL HERE //and send the response back to the client here } }Método del controlador:
@RequestMapping(value = "${foo.controller.requestMappingUrl.login}", method = RequestMethod.POST) public ResponseMessage<String> loginUser( @RequestParam("username") String username, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { return fooService.login(username); }Configuración de JUnit y métodos de prueba:
@InjectMocks private ProjectController projectController; @Mock private FooService fooService; @Mock private MessageByLocaleService messageByLocaleService; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mockMvc = MockMvcBuilders.standaloneSetup(projectController) .setMessageConverters(new MappingJackson2HttpMessageConverter()) .setControllerAdvice(new ExceptionControllerAdvice()).build(); } @SuppressWarnings("unchecked") @Test public void testControllerUserNotFoundException() throws Exception { Response resp = new Response(); resp.setStatusCode(StatusCode.UserNotFoundErrorCode); when(fooService.login(any(String.class)). thenThrow(UserNotFoundException.class); mockMvc.perform(post("/service-user/1.0/auth/login?&username=test") .contentType(contentType)). andExpect(status().isNotAcceptable()) .andExpect(jsonPath("$.statusCode", is("ERRORCODE144"))); }Es un poco difícil saberlo a partir del código que ha mostrado, pero presumiblemente está probando ExceptionControllerAdvice y crea una instancia en algún lugar de su Prueba unitaria. Si lo hace, intente lo siguiente @InjectMocks private ExceptionControllerAdvice unitUnderTest; @Mock private MessageByLocaleService messageByLocaleService;
Creo que Mockito creará un simulacro de MessageByLocaleService y lo inyectará automáticamente en su ExceptionControllerAdvice.