5

W ramach Spring 3 MVC możliwe jest wstrzyknięcie obiektu aktualnie zalogowanego użytkownika (Zasada) do metody kontrolera.Spring 3 Test integracji sterownika MVC - wstrzyknięcie Principal do metody

E.g.

@Controller 
public class MyController { 

    @RequestMapping(value="/update", method = RequestMethod.POST) 
    public String update(ModelMap model, Principal principal) { 

     String name = principal.getName(); 
     ... the rest here 
    } 
} 

Jest to udokumentowane jako część dokumentacji tutaj Wiosna 3: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-arguments.

To działa w kodzie produkcji. Jednak nie wiem, jak to przetestować. Po utworzeniu testu integracji (po skonfigurowaniu kontekstu zabezpieczenia sprężynowego) i wywołaniu metody obsługi kontrolera, wówczas zleceniodawca jest zawsze zerowy!

public class FareTypeControllerIntegrationTest extends SpringTestBase { 

@Autowired 
private MyController controller; 

@Autowired 
private AnnotationMethodHandlerAdapter handlerAdapter; 

private final MockHttpServletRequest request = new MockHttpServletRequest(); 
private final MockHttpServletResponse response = new MockHttpServletResponse(); 

@Test 
public void testUpdate() throws Exception { 
    request.setRequestURI("/update"); 
    request.setMethod(HttpMethod.POST.name()); 
    ... setup rest of request 

    ModelAndView mav = handlerAdapter.handle(request, response, controller); 

    .. rest of assertions 

} 

Testy działa poprawnie i wszystko z wyjątkiem Zleceniodawcą jest null.

Wszelkie pomysły?

TIA

Ayub

Odpowiedz

10

po szybkie spojrzenie na źródła Spring powinno działać:

request.setUserPrincipal(somePrincipal); 
+0

Próbowałem tego i zadziałało. Całkiem proste i zadbane. Dzięki –

1

zrobić coś takiego w moich testach przed kodu przy użyciu Wiosna Zabezpieczenia numerem (takie jako główny parametr rezolwerem testowanej):

SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken("wiseau", "Love is blind")); 
4

Mam tr Aby to zrobić jakiś czas temu, oto metoda, której użyłem do ustawienia uwierzytelniania.

protected void setSecurityContext(String login){ 
      userDetailsTest = userManager.loadUserByUsername(login); 
      TestingAuthenticationToken testingAuthenticationToken = new TestingAuthenticationToken(userDetailsTest, userDetailsTest.getAuthorities()); 
      SecurityContext securityContext = new SecurityContextImpl(); 
      securityContext.setAuthentication((Authentication) testingAuthenticationToken); 
      SecurityContextHolder.setContext(securityContext); 
     } 

Następnie po prostu nazywam to metodą @Before testu. Mam nadzieję, że to pomaga.

+0

Cześć Próbowałem powyższego przykładu, który jest podobny do tego, który wypróbowałem wcześniej. –

+0

Ups, chodzi mi o to, że wypróbowałem powyższe i nie działało. Dzięki –

Powiązane problemy