如何模拟公共 API(第三方 API)以生成 spring restdocs

Posted

技术标签:

【中文标题】如何模拟公共 API(第三方 API)以生成 spring restdocs【英文标题】:How to mock public API (Third Party API) to generate spring restdocs 【发布时间】:2019-01-23 07:28:04 【问题描述】:

我能够为我创建的休息服务生成休息文档,但无法为我正在使用的服务生成文档。

有没有办法为第三方 API 测试和生成文档。

我用来生成本地服务文档的示例代码。

@RunWith(SpringRunner.class)
@WebAppConfiguration
@SpringBootTest(classes = RestdocApplication.class)
public class CountryDocumentation 
private static final Logger logger = 
LoggerFactory.getLogger(CountryDocumentation.class);

private MockMvc mockMvc;
@Autowired
private WebApplicationContext context;

@Rule
public final JUnitRestDocumentation restDocumentation = new 
JUnitRestDocumentation("target/generated-snippets");

@Mock
private CountryService countryService;

@Mock
private RestTemplate restTemplate;

@Before
public void setUp() 
    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).apply(documentationConfiguration(this.restDocumentation)
            .uris().withHost("X.X.X.X").withPort(9090).and().operationPreprocessors()
            .withResponseDefaults(prettyPrint())
            .withRequestDefaults(prettyPrint())).defaultRequest(get("/")).build();


@Test
public void getCountryDefinition() throws Exception 
    this.mockMvc.perform(get("/"))
            .andExpect(status().is(200))
            .andDo(document("ClassName/methodName"));


【问题讨论】:

这与我的要求有关,但没有给出我的解决方案。 github.com/spring-projects/spring-restdocs/issues/293 【参考方案1】:

有许多用于模拟/虚拟化服务的产品。包括SoapUI和Parasoft Virtualize。

【讨论】:

我知道许多其他工具,如 swagger、RAML 等,但可以通过 restdocs 做同样的事情。请建议 swagger 和 RAML 都不是虚拟化工具。 REST 文档也不是。此工具用于记录服务,而不是用于创建虚拟服务。 没错,我想记录服务,而不是创建虚拟服务,但我想模拟实际调用。 这与我的要求有关,但没有给出我的解决方案。 github.com/spring-projects/spring-restdocs/issues/293【参考方案2】:

您在评论中说过要模拟对远程服务的实际调用。我认为这会使文档变得毫无意义。如果生成文档的测试正在调用模拟服务,那么您记录的是模拟而不是服务。如果您想要 REST Docs 的测试驱动文档生成方法的好处,您的测试需要调用正在记录的服务。如果该服务只能远程访问,那么您需要进行 HTTP 调用来记录它。

您可以使用带有 REST Assured 或 WebTestClient 的 Spring REST Docs 来记录可通过 HTTP 访问的任何服务。下面是一个 REST Assured 示例,它记录了 Stack Exchange 的 API 的一部分:

import io.restassured.builder.RequestSpecBuilder;
import io.restassured.http.ContentType;
import io.restassured.specification.RequestSpecification;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import org.springframework.restdocs.JUnitRestDocumentation;

import static io.restassured.RestAssured.given;
import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document;
import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.documentationConfiguration;

public class RestAssuredExampleTests 

    @Rule
    public JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation();

    private RequestSpecification documentationSpec;

    @Before
    public void setUp() 
        this.documentationSpec = new RequestSpecBuilder()
                .addFilter(documentationConfiguration(this.restDocumentation))
                .setBaseUri("https://api.stackexchange.com/2.2").build();
    

    @Test
    public void answers() throws Exception 
        given(this.documentationSpec).accept(ContentType.JSON).filter(document("answers"))
                .when().get("answers?order=desc&sort=activity&site=***").then()
                .assertThat().statusCode(200);
    


【讨论】:

我同意您的回答,并且我也使用相同的(REST Assured)来记录远程服务。但我只是想知道,当我们在生产环境中测试远程服务时,有什么方法可以模拟远程服务。

以上是关于如何模拟公共 API(第三方 API)以生成 spring restdocs的主要内容,如果未能解决你的问题,请参考以下文章

服务如何生成和使用公共和秘密 API 密钥?

Node.js:如何测试我的 API,模拟我的 API 调用的第三方 API

api design - 如何设计公共 POST api 以防止垃圾邮件请求

如何使用Curl在没有前端的格子api的后端生成公共令牌?

使用 Keycloak 时模拟“生成 API 令牌”的最佳实践

我应该如何保护这个公共 API?