2017-09-17 13 views
1

私はこのように私のコントローラおよびコントローラのアドバイスを作成しています:SpringBootTestだけでセットアップが設定にもかかわらず、私のControllerAdviceをロードしていないスタンドそれ

Testクラス:

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class TestController { 

    private MockMvc mockMvc; 

    @Mock 
    private MyService myService; 

    @Autowired 
    @InjectMocks 
    private MyController myController; 

    @Before 
    public void setup() { 

     MockitoAnnotations.initMocks(this); 

     //Build the controller mock handler 
     mockMvc = MockMvcBuilders 
      .standaloneSetup(MyController.class) 
      .setControllerAdvice(new MyControllerAdvice()) 

      //This also doesn't work 
      //.setHandlerExceptionResolvers(createExceptionResolver()) 
      .build(); 
    } 

    //This also did not work 
    private ExceptionHandlerExceptionResolver createExceptionResolver() { 
     ExceptionHandlerExceptionResolver exceptionResolver = new ExceptionHandlerExceptionResolver() { 
      protected ServletInvocableHandlerMethod getExceptionHandlerMethod(HandlerMethod handlerMethod, Exception exception) { 
       Method method = new ExceptionHandlerMethodResolver(MyControllerAdvice.class).resolveMethod(exception); 
       return new ServletInvocableHandlerMethod(new MyControllerAdvice(), method); 
      } 
     }; 
     exceptionResolver.afterPropertiesSet(); 
     return exceptionResolver; 
    } 

    /** 
    * Tests passing bad input to see if our exception handler is called. 
    */ 
    @Test 
    public void testBadRequest() 
    { 
     //Make a request object that has a bad input (e.g. bad date string) 
     MyRequest request = new MyRequest(); 

     //Set the request values 
     request.setDate("a"); 

     try 
     { 
      myController.getSomething(request); 
     } 
     catch (Exception e) 
     { 
      //It reaches here without ever reaching my controller advice in debugging 
      e.printStackTrace(); 
     } 
    } 
} 

コントローラーのアドバイス:

@EnableWebMvc 
@ControllerAdvice 
@Component 
public class MyControllerAdvice { 

    @ExceptionHandler(value = Exception.class) 
    public ResponseEntity<String> handleException(HttpServletRequest request, Exception exception) throws Exception 
    { 
     //This is never called (I'm using a debugger and have a breakpoint here) 
     return new ResponseEntity<String>(
      "test", 
      HttpStatus.INTERNAL_SERVER_ERROR 
     ); 
    } 
} 

答えて

1

例には2つの問題があります。

  1. MockMvcBuilders#standaloneSetup()Controllerオブジェクトをパラメータとして受け取り、Classオブジェクトは受け取りません。だから、次のようになります。

    mockMvc = MockMvcBuilders 
         .standaloneSetup(new MyController()) 
         .setControllerAdvice(new MyControllerAdvice()) 
         .build(); 
    
  2. 以前mockMvcを構築し使用する必要がありながら、あなたは、直接myController.getSomething(request)を呼び出しています。ダイレクトコールはTestDispatcherServletで処理されていないため、アドバイスしていません。

mockMvc.perform(post("/testSomething") 
        .contentType(MediaType.APPLICATION_JSON) 
        .content(json)) //it's JSON string 
      .andExpect(status().is5xxServerError()) 
      .andReturn(); 

mockMvc.perform(get("/testSomething")) 
      .andExpect(status().is5xxServerError()) 
      .andReturn(); 

POSTをGET:ここではmockMvc要求のための例のカップルです

関連する問題