2015-10-06 30 views
3

我正在嘗試執行集成測試,以查看我的註冊端點失敗時的行爲。我的註冊端點是由外部源(由Spring OAuth保護)提供的API。客戶端網站使用客戶端Spring Oauth與API進行通信。針對Spring Oauth的模擬服務器端點

我試圖做的是嘲笑API,但是,我得到的問題不是針對嘲諷的端點; org.springframework.web.client.ResourceAccessException:對「http://localhost:8081/oauth/token」POST請求的I/O錯誤:連接被拒絕:連接;嵌套異常是java.net.ConnectException:連接被拒絕:連接。下面是我下面的測試:

@WebAppConfiguration 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath*:RegistrationControllerIntegrationTest-context.xml"}) 
public class RegistrationControllerIntegrationTest { 


    @Resource 
    RegistrationController registrationController; 

    @Resource 
    private WebApplicationContext webApplicationContext; 

    MockMvc mockMvc; 

    @Value("${oauth.accessTokenUri}") 
    private String oauthUri; 

    private MockRestServiceServer mockRestServiceServer; 


    private OAuth2RestTemplate clientCredRest; 


    @Resource(name = "clientCredentialRest") 
    public void setClientCredRest(OAuth2RestTemplate clientCredRest) { 
    this.clientCredRest = clientCredRest; 
    } 



    @Before 
    public void setUp() 
    { 
    this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 

    this.mockRestServiceServer = MockRestServiceServer.createServer(this.clientCredRest); 


    } 
    @Test 
    public void testRegistrationThatReturnsBadRequestWhenUserAlreadyExist() 
    { 




this.mockRestServiceServer.expect(MockRestRequestMatchers.requestTo("localhost:8081/oauth/token")).andExpect(MockRestRequestMatchers.method(HttpMethod.POST)) 
    .andRespond(MockRestResponseCreators.withSuccess().contentType(MediaType.APPLICATION_JSON).body("{\n" + 
      "\"access_token\": \"8ecd93d4-2484-46de-922a-652fa79d027d\",\n" + 
      "\"token_type\": \"bearer\",\n" + 
      "\"expires_in\": 1265\n" + 
      "\"scope\": \"read write\"\n" + 
      "}")); 

     Gson gson = Converters.registerDateTime(new GsonBuilder()).create(); 
     PodamFactory factory = new PodamFactoryImpl(); 
     RegistrationDTO dto = factory.manufacturePojo(RegistrationDTO.class); 
    dto.setUserName("test"); 
     String json = gson.toJson(dto); 


     this.mockRestServiceServer.expect(MockRestRequestMatchers.requestTo("localhost:8081/public/registration")).andExpect(MockRestRequestMatchers.method(HttpMethod.POST)) 
      .andRespond(MockRestResponseCreators.withBadRequest().contentType(MediaType.APPLICATION_JSON).body("{\n" + 
        "resource: null\n" + 
        "field: \"user_name\"\n" + 
        "code: \"0\"\n" + 
        "message: \"Username already exist\"\n" + 
        "}")); 

     MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post("/frontend/register").content(json).header("activate", "true").header("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36").header("Origin","chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo").contentType(MediaType.APPLICATION_JSON); 

     try { 
      this.mockMvc.perform(requestBuilder).andExpect(MockMvcResultMatchers.status().isBadRequest()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

注意,我之所以設置這兩個預期的嘲笑Web服務器是由於春季的Oauth如何獲取發出請求到public/registration終點前一個訪問令牌。讓我知道我是否缺少任何東西。

謝謝。

+0

它看起來像OAuth2RestTemplate創建一個內部RestTemplate檢索不被綁定MockRestServiceServer所述令牌。我在Spring中創建了一個問題https://github.com/spring-projects/spring-security/issues/4217 – Tuno

回答

0

一兩件事你可以做的是模擬的OAuth2AccessTokenOAuth2AccessToken

0

我解決它通過覆蓋UserInfoRestTemplateFactory,使OAuth2RestTemplate一個bean。這是從Spring Boot 1.5.0開始提供的。

實施例:

@RunWith(SpringRunner.class) 
@SpringBootTest 
@AutoConfigureMockMvc 
public class OAuth2Test { 

    @TestConfiguration 
    static class OAuth2TestConfiguration { 

     @Bean 
     UserInfoRestTemplateFactory userInfoRestTemplateFactory(
      ObjectProvider<List<UserInfoRestTemplateCustomizer>> customizers, 
      ObjectProvider<OAuth2ProtectedResourceDetails> details, 
      ObjectProvider<OAuth2ClientContext> context) { 

      return new DefaultUserInfoRestTemplateFactory(customizers, details, context); 
     } 

     @Bean 
     OAuth2RestTemplate oAuth2RestTemplate(UserInfoRestTemplateFactory factory) { 
      return factory.getUserInfoRestTemplate(); 
     } 

    } 

    @Autowired 
    private ResourceServerProperties resourceServerProperties; 

    @Autowired 
    private MockMvc mockMvc; 

    @Autowired 
    private OAuth2RestTemplate oAuth2RestTemplate; 

    @Before 
    public void setUp() throws Exception { 
     createServer(oAuth2RestTemplate) 
      .expect(requestTo(resourceServerProperties.getUserInfoUri())) 
      .andExpect(header(HttpHeaders.AUTHORIZATION, OAuth2AccessToken.BEARER_TYPE + " " + ACCESS_TOKEN)) 
      .andRespond(withSuccess("{}", MediaType.APPLICATION_JSON)); 
    } 

    @Test 
    public void testProtectedResource() throws Exception { 
     mockMvc.perform(get("/protected-resource").with(oauth2Token())) 
      .andExpect(status().isNotFound()); 
    } 

    private RequestPostProcessor oauth2Token() { 
     return request -> { 
      request.addHeader(HttpHeaders.AUTHORIZATION, OAuth2AccessToken.BEARER_TYPE + " " + ACCESS_TOKEN); 
      return request; 
     }; 
    } 

}