5

Là một phần của Spring 3 MVC, có thể tiêm đối tượng người dùng hiện đang đăng nhập vào một phương thức điều khiển.Kiểm tra tích hợp bộ điều khiển MVC mùa xuân 3 - Đưa hiệu trưởng vào phương thức

Ví dụ:

@Controller 
public class MyController { 

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

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

này được ghi chép lại như một phần của mùa xuân 3 tài liệu ở đây: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-arguments.

Điều này hoạt động trong mã sản xuất. Tuy nhiên tôi không biết làm thế nào để kiểm tra điều này. Khi tôi tạo thử nghiệm tích hợp (cũng đã thiết lập bối cảnh bảo mật mùa xuân) và gọi phương thức xử lý bộ điều khiển thì Hiệu trưởng luôn là giá trị rỗng!

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 

} 

Các kiểm tra đang chạy chính xác và mọi thứ ngoại trừ Hiệu trưởng không có giá trị.

Bất kỳ ý tưởng nào?

TIA

Ayub

Trả lời

10

Sau một xem nhanh nguồn Spring sẽ hoạt động:

request.setUserPrincipal(somePrincipal); 
+0

Tôi đã thử cách này và hoạt động. Khá đơn giản và gọn gàng. Cảm ơn –

1

tôi làm điều gì đó như thế này trong các thử nghiệm của tôi trước khi gọi mã sử dụng Xuân An (chẳng hạn như các thông số phân giải Principal bạn đang thử nghiệm):

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

Tôi đã tr ied để làm điều này một thời gian trước đây, đây là phương pháp tôi được sử dụng để thiết lập xác thực.

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

Sau đó, tôi chỉ gọi nó trong phương pháp @Trước khi thử nghiệm. Hy vọng điều đó sẽ hữu ích.

+0

Xin chào Tôi đã thử ví dụ trên, tương tự như những gì tôi đã thử trước đó. –

+0

Rất tiếc, ý tôi là tôi đã thử ở trên và dường như không hoạt động. Cảm ơn –