2017-07-19 8 views
0

Ich versuche, die richtige Konfiguration zum Testen HandlerInterceptor einer Spring-Boot-Anwendung mit @MockBean Abhängigkeiten zu finden, aber ohne Initialisierung der gesamten Bean-Pool, weil einige Controller Aufrufe haben können nicht verspottet werden (wissend, dass @Before Anruf nach @PostContruct Controller-Aufruf kommt).Vermeiden Sie Controller-Initialisierung beim Testen Spring-Boot HandlerInterceptor

Denn jetzt bin ich in diese Syntax kommen:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringBootTest(classes = Application.class) 
public class MyHandlerInterceptorTest { 
    @Autowired 
    private RequestMappingHandlerAdapter handlerAdapter; 
    @Autowired 
    private RequestMappingHandlerMapping handlerMapping; 
    @MockBean 
    private ProprieteService proprieteService; 
    @MockBean 
    private AuthentificationToken authentificationToken; 

    @Before 
    public void initMocks(){ 
    given(proprieteService.methodMock(anyString())).willReturn("foo"); 
    } 

    @Test 
    public void testInterceptorOptionRequest() throws Exception { 
    MockHttpServletRequest request = new MockHttpServletRequest(); 
    request.setRequestURI("/some/path"); 
    request.setMethod("OPTIONS"); 

    MockHttpServletResponse response = processPreHandleInterceptors(request); 
    assertEquals(HttpStatus.OK.value(), response.getStatus()); 
    } 
} 

Aber Test nicht besteht, java.lang.IllegalStateException: Failed to load ApplicationContext weil man RestController einen @PostContruct Anruf mit versucht, Daten von proprieteService mock zu erhalten, der nicht in diesem Moment verspottet haben.

Also meine Frage ist: Wie kann ich verhindern Springboot Test Loader alle meine Controller zu initialisieren, die 1: Ich brauche nicht für den Test, 2: Auslöser Anrufe, die passieren, bevor ich etwas verspotten kann?

+3

Schreiben Sie einen Komponententest NICHT einen Integrationstest. Instantiiere den 'HandlerInterceptor', erzeuge Mocks und injiziere sie. –

+0

In diesem Fall, wie man '@ autowired' Abhängigkeiten in meinem Interceptor verspottet? Ich würde spezielle Spring-Boot-Annotationen benötigen, '@ SpringBootTest' machte die Arbeit. – Aphax

Antwort

1

@M. Deinum zeigte mir den Weg, tatsächlich bestand die Lösung darin, einen echten Unit Test zu schreiben. Meine Sorge war, dass ich diese @autowired Abhängigkeiten in meinem bevölkern musste, und nach einer magischen Annotation suchte. Aber es war einfacher, nur die WebMvcConfigurerAdapter benutzerdefinierte zu bearbeiten und die Abhängigkeiten über Konstruktor wie dies passieren:

@Configuration 
public class CustomWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter { 
    AuthentificationToken authentificationToken; 

    @Autowired 
    public CustomWebMvcConfigurerAdapter(AuthentificationToken authentificationToken) { 
    this.authentificationToken = authentificationToken; 
    } 

    @Bean 
    public CustomHandlerInterceptor customHandlerInterceptor() { 
    return new CustomHandlerInterceptor(authentificationToken); 
    } 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
    registry.addInterceptor(customHandlerInterceptor()); 
    } 
} 

Und Interceptor:

public class CustomHandlerInterceptor implements HandlerInterceptor { 
    private AuthentificationToken authentificationToken; 

    @Autowired 
    public CustomHandlerInterceptor(AuthentificationToken authentificationToken) { 
    this.authentificationToken = authentificationToken; 
    } 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
    } 
} 

Hope this helfen kann.

Verwandte Themen