Java Spring Oauth端点的模拟服务器

Java Spring Oauth端点的模拟服务器,java,spring,spring-mvc,spring-security-oauth2,Java,Spring,Spring Mvc,Spring Security Oauth2,我正在尝试进行集成测试,以查看注册端点失败时的行为。我的注册端点是由外部源(由SpringOAuth保护)提供的API。客户端网站正在使用客户端Spring Oauth与API通信 我试图做的是模拟API,但是,我遇到的问题是,请求不符合模拟的端点org.springframework.web.client.ResourceAccessException:对“”的POST请求发生I/O错误:连接被拒绝:连接;嵌套异常为java.net.ConnectException:连接被拒绝:connect

我正在尝试进行集成测试,以查看注册端点失败时的行为。我的注册端点是由外部源(由SpringOAuth保护)提供的API。客户端网站正在使用客户端Spring Oauth与API通信

我试图做的是模拟API,但是,我遇到的问题是,请求不符合模拟的端点org.springframework.web.client.ResourceAccessException:对“”的POST请求发生I/O错误:连接被拒绝:连接;嵌套异常为java.net.ConnectException:连接被拒绝:connect。下面是我的测试:

 @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服务器设置两个期望值的原因是Spring Oauth在向
public/registration
endpoint发出请求之前如何获取访问令牌。如果我遗漏了什么,请告诉我


谢谢

您可以做的一件事是模拟
OAuth2AccessToken
OAuth2AccessToken
我通过覆盖
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;
        };
    }

}
@RunWith(SpringRunner.class)
@春靴测试
@AutoConfigureMockMvc
公共类OAuth2Test{
@测试配置
静态类OAuth2TestConfiguration{
@豆子
UserInfoRestTemplateFactory UserInfoRestTemplateFactory(
ObjectProvider自定义程序,
ObjectProvider详细信息,
对象提供程序(上下文){
返回新的DefaultUserInfoRestTemplateFactory(自定义项、详细信息、上下文);
}
@豆子
OAuth2RestTemplate OAuth2RestTemplate(UserInfoRestTemplateFactory){
返回factory.getUserInfoRestTemplate();
}
}
@自动连线
私有ResourceServerProperties ResourceServerProperties;
@自动连线
私有MockMvc-MockMvc;
@自动连线
专用OAuth2RestTemplate OAuth2RestTemplate;
@以前
public void setUp()引发异常{
createServer(oAuth2RestTemplate)
.expect(requestTo(resourceServerProperties.getUserInfoUri())
.andExpect(标头(HttpHeaders.AUTHORIZATION,OAuth2AccessToken.BEARER\u TYPE+“”+ACCESS\u TOKEN))
.andRespond(使用success(“{}”,MediaType.APPLICATION_JSON));
}
@试验
public void testProtectedResource()引发异常{
使用(oauth2Token())执行(get(“/protected resource”)。)
.andExpect(status().isNotFound());
}
私有请求后处理器oauth2Token(){
退货申请->{
request.addHeader(HttpHeaders.AUTHORIZATION,OAuth2AccessToken.BEARER_TYPE+“”+ACCESS_TOKEN);
返回请求;
};
}
}

设置accesstoken对我来说很有用,这会阻止OAuth2RestTemplate获取accesstoken本身:

@Before
public void before() {
    mockServer = MockRestServiceServer.createServer(oAuth2RestTemplate);
    oAuth2RestTemplate.getOAuth2ClientContext().setAccessToken(
            new DefaultOAuth2AccessToken("accesstoken")
    );
}

看起来OAuth2RestTemplate创建了一个内部RestTemplate来检索未被MockRestServiceServer绑定的令牌。我在春天创造了一个问题