2017-08-27 3 views
2

J'essaie de créer mon premier test pour un simple contrôleur spring-boot mais je reçois Handler: Type = null. Dans le code du navigateur est le travail, mais un test échoue. Mon application utilise printemps-sécurité. S'il vous plaît, aidez-moi à résoudre le problème et à comprendre mon erreur. Je vous remercie.Pourquoi le test de printemps échoue, ne fonctionne pas @MockBean

Ce contrôleur est:

private final ItemService service; 

@GetMapping("/get_all_items") 
public String getAllItems(Model model) { 
    model.addAttribute("items", service.getAll()); 
    return "all_items"; 
} 

Ceci est un test.

@RunWith(SpringRunner.class) 
@WebMvcTest(ItemController.class) 
public class ItemControllerTest { 

    @Autowired 
    private MockMvc mvc; 

    @MockBean 
    private ItemService itemService; 

    @Test 
    @WithMockUser(username = "user", roles = "user")//mock security. 
    public void whenGetAllItemsThenControllerReturnAllItems() throws Exception { 
     given(
      itemService.getAll() 
     ).willReturn(
       new ArrayList<Item>() 
     ); 

     mvc.perform(
      get("/get_all_items").accept(MediaType.TEXT_HTML) 
     ).andExpect(
       status().isOk() 
     ); 
    } 
} 

C'est résultat journal:

MockHttpServletRequest: HTTP Method = GET Request URI = /get_all_items Parameters = {} Headers = {Accept=[text/html]}

Handler: Type = null

Async: Async started = false Async result = null

Resolved Exception: Type = null

ModelAndView: View name = null View = null Model = null

FlashMap: Attributes = null

MockHttpServletResponse: Status = 403 Error message = Access is denied Headers = {X-Content-Type-Options=[nosniff], X-XSS-Protection=[1; mode=block], Cache-Control=[no-cache, no-store, max-age=0, must-revalidate], Pragma=[no-cache], Expires=[0], X-Frame-Options=[DENY], Strict-Transport-Security=[max-age=31536000 ; includeSubDomains]} Content type = null Body = Forwarded URL = null Redirected URL = null Cookies = []

java.lang.AssertionError: Status Expected :200 Actual :403

+0

Avez-vous essayé '@ MockMvc'? Y a-t-il des changements? – Reborn

+0

L'erreur est juste là. ': Status = 403 Message d'erreur = L'accès est refusé Header'. Vous devez fournir des informations de sécurité ou les désactiver pour les tests unitaires. –

+0

@Darren Forsythe Oui mais j'utilise '@WithMockUser (username =" user ", roles =" user ")' ce n'est pas suffisant? Comment implémenter fournir des creds de sécurité? Je pense que mon @WithMockUser résoudre. – Pavel

Répondre

1

Ceci est essentiellement une double question qui a été répondu ici: https://stackoverflow.com/a/38676144/388980

La solution consiste à importation la classe @Configuration pour votre sécurité Spring configuration en plus de déclarer @WebMvcTest(ItemController.class) comme ceci @Import(SecurityConfig.class) (en supposant que votre configuration personnalisée pour Spring Security est dans une classe nommée SecurityConfig).

Vous trouverez peut-être aussi la discussion dans le suivi des problèmes de Spring Boot utile ainsi: https://github.com/spring-projects/spring-boot/issues/6514

L'autre option est de désactiver Spring Security comme expliqué ici: Disable security for unit tests with spring boot

+0

mon erreur @WithMockUser (username = "user", rôles = "utilisateur") -> @ WithMockUser (username = "user", rôles = "USER") besoin de convertir le rôle "utilisateur" aussi CAPSLOOK. Et tout va bien. – Pavel