2012-03-20 4 views
4

스프링 보안 3.1에서 스프링 3.1.0.RELEASE를 사용하고 있습니다. Spring 사용자 (즉, 현재 로그인 한 사용자)를 컨트롤러에 삽입하려고합니다. 그것은 나를 JUnit을보다 쉽게 ​​컨트롤러를 테스트 할 수 있기 때문에내 스프링 보안 사용자를 내 컨트롤러에 삽입하는 데 문제가 있습니다.

SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 

를 사용하는 것이 아니라 나는이 작업을 수행 할 수. 그러나 현재 설정에 문제가 있습니다. 내 질문은 내 컨트롤러에 내 사용자 (요청 당)를 주입하는 올바른 방법은 무엇입니까? 내 응용 프로그램 컨텍스트 파일에서, 나는 ...이

내가 아니라 내 공장 클래스를 정의
<bean id="userDetails" class="com.myco.eventmaven.security.SecurityHolder" factory-method="getUserDetails" scope="request"> 
    <aop:scoped-proxy /> 
</bean> 

...

public class SecurityHolder { 

@Autowired 
private static UserService userService; 

public static MyUserDetails getUserDetails() { 
    final Authentication a = SecurityContextHolder.getContext().getAuthentication(); 
    if (a == null) { 
     return null; 
    } else { 
     final MyUserDetails reg = (MyUserDetails) a.getPrincipal(); 
     final int userId = reg.getId(); 
     final MyUserDetails foundUser = userService.findUserById(userId); 
     return foundUser; 
    } // if 
} // getUserDetails 

} 

하지만 "userService는"autowire가 얻을하지 못하기 때문에 팩토리 클래스는 반복적으로 사망 (값은 항상 null입니다). JUnit 테스트에 쉽게 통합 할 수있는 더 좋은 방법을 찾고 있습니다. 어떤 아이디어?

편집 : 여기 내가

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({ "file:src/test/resources/testApplicationContext.xml" }) 
public class UserEventFeedsControllerTest extends AbstractTransactionalJUnit4SpringContextTests { 

private MockHttpServletRequest request; 
private MockHttpServletResponse response; 
... 
@Autowired 
private RequestMappingHandlerAdapter handlerAdapter; 

@Autowired 
private RequestMappingHandlerMapping handlerMapping; 

@Before 
public void setUp() { 
    ... 
    request = new MockHttpServletRequest(); 
    response = new MockHttpServletResponse(); 
} 
... 
@Test 
public void testSubmitUserEventFeedsForm() throws Exception { 
    request.setRequestURI("/eventfeeds.jsp"); 
    request.setMethod("POST"); 
    final List<EventFeed> allEventFeeds = getAllEventFeeds(); 
    request.setParameter("userEventFeeds", allEventFeeds.get(0).getId().toString()); 

    final Object handler = handlerMapping.getHandler(request).getHandler(); 
    final ModelAndView mav = handlerAdapter.handle(request, response, handler); 

    assertViewName(mav, "user/eventfeeds"); 
} 

답변

10

당신은 static 필드를 autowire하기 수 없습니다 ... 작업을 찾고있어 JUnit 테스트입니다. ... 거기에 몇 가지 해결 방법이 있습니다,하지만 난 당신에게 보여주고 싶지 않은

보다 쉽고 우아한 문제에 현재 사용자가 액세스 할 수있는 방법이 많이 있습니다

첫 번째 제안에 대해서는 참조

+0

테스트의 목적을 위해, 어떻게 내가 교장 개체를 삽입 할 Spring4JUnitRunner 클래스를 사용하는 JUnit 테스트에서? Junit 테스트를 어떻게 실행하는지 보여주는 코드 예제를 추가했습니다. – Dave

+0

@Dave : 살펴보기 : http://stackoverflow.com/questions/8990931 –

+0

원본 UserDetails 객체에서 Principal 객체로 우아한 방법을 찾을 수 없어 확장 된 테스트 클래스를 만들어야했습니다. 내 원래 UserDetails 객체와 Principal을 구현했습니다. 귀하의 링크마다 요청 클래스에 테스트 클래스를 삽입 했으므로 좋은 결과를 얻었습니다. – Dave

관련 문제