2016-07-12 2 views
1

저는 Spring MVC 애플리케이션에 대한 통합 테스트를 작성하려고했습니다. 우리는 인증을 위해 oAuth2를 사용하고 있습니다.Java Spring MVC 통합 테스트 생성 OAuth2 Principal

봄이 경우 우리는 클라이언트에 다시 전송해야하는 엔티티를 결정하는 데 사용하는 Principal 인스턴스를 제공합니다. 우리 컨트롤러에는 엔드 포인트가 있습니다 :

@RequestMapping("/bookings") 
public @ResponseBody ResponseEntity<List<ThirdPartyBooking>> getBookings(Principal principal) { 
    OAuth2Authentication auth = (OAuth2Authentication) principal; 
    OAuth2AuthenticationDetails authDetails = (OAuthAuthenticationDetails) auth.getDetails(); 
    // Extract stuff from the details... 
} 

이제 우리는 인증 된 사용자에 대해서만 예약을 보내고 싶습니다. 시험에 대한 코드 아래 찾을 수 있습니다

는 는
@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = {ThirdPartyBookingServiceConfiguration.class}) 
@WebAppConfiguration 
@Component 
public abstract class RepositoryTestBase { 
    @Resource 
    private WebApplicationContext context; 
    private MockMvc mockMvc; 

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

    @Test 
    public void shouldOnlyReturnUserBookings() throws Exception { 
     MockHttpServletResponse result = mockMvc.perform(MockMvcRequestBuilders.get("/bookings").principal(???)).andReturn().getResponse(); 
     // Validate the response 
    } 
} 

는 어떻게 OAuth2Authentication???에 삽입합니다 ?

답변

1

나는 테스트 인증을 위해 RequestPostProcessor을 사용합니다.

@Component 
public class OAuthHelper { 

    @Autowired 
    AuthorizationServerTokenServices tokenservice; 

    public RequestPostProcessor addBearerToken(final String username, String... authorities) 
    { 
     return mockRequest -> { 
      OAuth2Request oauth2Request = new OAuth2Request(null, "client-id", 
         null, true, null, null, null, null, null); 
      Authentication userauth = new TestingAuthenticationToken(username, null, authorities); 
      OAuth2Authentication oauth2auth = new OAuth2Authentication(oauth2Request, userauth); 
      OAuth2AccessToken token = tokenservice.createAccessToken(oauth2auth); 

      mockRequest.addHeader("Authorization", "Bearer " + token.getValue()); 
      return mockRequest; 
     }; 
    } 
} 

을 그리고 테스트에 사용 : : 그냥 요청에 스텁 토큰를 추가

accessToken = authHelper.addBearerToken(TEST_USER, TEST_ROLE); 
    mockMvc.perform(get("/cats").with(accessToken)) 
+0

를이 내가 찾던 정확히 무엇을이었다. 그것은 크게 도움이되었습니다. 감사! – irundaia

관련 문제