2015-05-29 15 views
19

Ich muss eine Get-Anfrage an die API senden, aber trotz der Administrator-Annotation erhalten Fehler@WithMockUser(roles="ADMINISTRADOR").
Wie sende ich eine Anfrage?

APIIntegrationstests mit Federsicherheit

@RequestMapping(value = "/{id}", method = RequestMethod.GET) 
@PostAuthorize("returnObject.instancia == principal.instancia.instancia") 
public Validacao retrieve(@PathVariable("id") String id) { 
    return validacaoService.retrieve(id); 
} 

-Test

@Test 
@WithMockUser(roles = "ADMINISTRADOR") 
public void testCRetrieve() throws Exception { 
     this.mockMvc 
       .perform(get("/api/validacao/" + id).with(user("[email protected]"))) 
       .andExpect(status().isOk()) 
       .andReturn(); 
} 

Log

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext 

Testklasse

@FixMethodOrder(MethodSorters.NAME_ASCENDING) 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {ValidacaoAPITest.TestConfiguration.class, WithSecurityConfig.class}) 
@WebAppConfiguration 
public class ValidacaoAPITest { 
    @EnableWebMvc 
    @Configuration 
    public static class TestConfiguration { 
     Fongo fongo = new Fongo("new server 1"); 
     DB db = fongo.getDB("oknok"); 

     @Bean 
     ValidacaoAPI getValidacaoAPI() { 
      return new ValidacaoAPI(); 
     } 

     @Bean 
     ActiveUser getActiveUser() { 
      ActiveUser mock = Mockito.mock(ActiveUser.class); 

      when(mock.getUser()).thenReturn(new User().setEmail("[email protected]")); 
      when(mock.getInstancia()).thenReturn(new Instancia().setInstancia("instancia")); 
      return mock; 
     } 

     @Bean 
     ValidacaoService getValidacaoService() { 
      return new ValidacaoService(); 
     } 

     @Bean 
     MatchService getMatchService() { 
      return new MatchService(); 
     } 

     @Bean 
     PlanilhaReader getPlanilhaReader() { 
      return new PlanilhaReader(); 
     } 


     @Bean 
     AtributoReader getAtributoReader() { 
      return new AtributoReader(); 
     } 

     @Bean 
     AtributoDAO getAtributoDAO() { 
      return new AtributoDAO(); 
     } 

     @Bean 
     UploadService getUploadService() { 
      return new UploadService(); 
     } 


     @Bean 
     ValidacaoResultadoDAO getValidacaoResultadoDAO() { 
      return new ValidacaoResultadoDAO(db); 
     } 


     @Bean 
     Mapper getMapper() { 
      return new Mapper(db); 
     } 

     @Bean 
     UploadDAO getUploadDAO() { 
      return new UploadDAO(db); 
     } 

     @Bean 
     MatchDAO getMatchDAO() { 
      return new MatchDAO(db); 
     } 

     @Bean 
     ValidacaoDAO getValidacaoDAO() { 
      return new ValidacaoDAO(db); 
     } 

     @Bean 
     UploadOriginalsDAO getUploadOriginalsDAO() { 
      return new UploadOriginalsDAO(db); 
     } 

     @Bean 
     AtributoValidator getAtributoValidator() { 
      return new AtributoValidator(); 
     } 

    } 

    @Autowired 
    MatchService matchService; 

    @Autowired 
    private WebApplicationContext context; 

    private MockMvc mockMvc; 

    private static String id; 

    @Before 
    public void setup() { 
     mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); 
    } 

    @Test 
    public void testACreateValidation() throws Exception { 
     MvcResult result = this.mockMvc 
       .perform(post("/api/validacao")) 
       .andExpect(status().isOk()) 
       .andExpect(jsonPath("$.id", notNullValue())) 
       .andReturn(); 
     this.id = ((BasicDBObject) JSON.parse(result.getResponse().getContentAsString())).getString("id"); 
    } 

    @Test 
    public void testBRetrieveAll() throws Exception { 
     MvcResult result = this.mockMvc 
       .perform(get("/api/validacao")) 
       .andExpect(status().isOk()) 
       .andExpect(jsonPath("$.[0].id", notNullValue())) 
       .andReturn(); 

     BasicDBList list = (BasicDBList) JSON.parse(result.getResponse().getContentAsString()); 
     this.id = (String) ((BasicDBObject) JSON.parse(list.get(0).toString())).get("id"); 
    } 

    //FIXME 
    @Test 
    @WithMockUser(roles = "ADMINISTRADOR") 
    public void testCRetrieve() throws Exception { 
      this.mockMvc 
        .perform(get("/api/validacao/" + id).with(user("[email protected]"))) 
        .andExpect(status().isOk()) 
        .andReturn(); 
    } 

} 
+0

haben Sie WithSecurityContextTestExceptionListener verwendet? Können Sie die komplette Testklasse zur Verfügung stellen? – coder

+0

Sie haben einen Rollentypo, @WithMockUser (roles = "ADMINISTRADOR"), sollte @WithMockUser (roles = "ADMINISTRATOR") sein. –

Antwort

23

Im Frühjahr Sicherheit Reference, section 10.1 besagt, dass Sie die Sicherheitsfilterkette in Ihr MockMvc-Objekt integrieren müssen, um die Federsicherheitsfunktionen testen zu können, wie in diesem Beispiel in der @Before-Setup-Methode gezeigt.

import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*; 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
@WebAppConfiguration 
public class CsrfShowcaseTests { 

    @Autowired 
    private WebApplicationContext context; 
    private MockMvc mvc; 

    @Before 
    public void setup() { 
     mvc = MockMvcBuilders 
      .webAppContextSetup(context) 
      .apply(springSecurity()) 
      .build(); 
    } 

... 

} 
+0

Vergessen zu erwähnen, um genauer zu sein, das ist, wenn Sie Frühlingssicherheitstests mit integrieren möchten Wenn Sie das Spring-Mvc-Testframework nicht verwenden möchten, ist dies nicht erforderlich. – saljuama

+0

In früheren Versionen von Spring-Sicherheit funktioniert dieser Ansatz: http://StackOverflow.com/Questions/23335200/Spring-Boot-Setup-Security-for-Testing – Shannon

Verwandte Themen