2017-07-19 3 views
0

J'essaie de trouver la bonne configuration pour tester HandlerInterceptor d'une application-boot Spring, avec @MockBean dépendances, mais sans initialiser l'ensemble piscine Bean, parce que certains contrôleurs ont @PostConstruct appels qui peuvent assurer ne pas être moqué (sachant que @Before appel vient après @PostContruct appel de contrôleur).Évitez l'initialisation des contrôleurs lors du test de démarrage de printemps HandlerInterceptor

Pour l'instant je suis venu à cette syntaxe:

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

Mais test échoue, java.lang.IllegalStateException: Failed to load ApplicationContext parce qu'un RestController ayant un appel @PostContruct tente d'obtenir des données de proprieteService maquette qui n'ont pas été moqué à ce moment. Donc ma question est: comment puis-je empêcher Springboot test loader d'initialiser tous mes contrôleurs, ce qui 1: je n'ai pas besoin pour le test, 2: déclencher des appels qui se passe avant que je puisse me moquer de quoi que ce soit?

+3

Écrire un test unitaire PAS un test d'intégration. Instanciez simplement 'HandlerInterceptor', créez des mocks et injectez-les. –

+0

Dans ce cas, comment se moquer des dépendances '@ autowired' dans mon Interceptor? J'aurais besoin d'annotations de démarrage Spring spéciales, '@ SpringBootTest' faisait l'affaire. – Aphax

Répondre

1

@M. Deinum m'a montré le chemin, en effet la solution était d'écrire un vrai test unitaire. Mon souci était que je devais remplir ces dépendances @autowired dans mon Intercepter, et cherchait une annotation magique. Mais il était plus simple de modifier la coutume WebMvcConfigurerAdapter et passer les dépendances via un constructeur comme ceci:

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

Et 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 { 
    } 
} 

espère que cela peut aider.