如何模拟公共 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的主要内容,如果未能解决你的问题,请参考以下文章
Node.js:如何测试我的 API,模拟我的 API 调用的第三方 API
api design - 如何设计公共 POST api 以防止垃圾邮件请求