【问题标题】:How to write test so that the controller can connect to API?如何编写测试以便控制器可以连接到 API?
【发布时间】:2019-10-31 20:34:28
【问题描述】:

我正在尝试处理 Rest api 测试。 嗯,我代码中的控制器连接到外部api解析并以JSON的形式返回。 我正在尝试运行一个测试,以便它返回我的应用程序逻辑的结果。 不幸的是,在测试过程中我无法连接 api github。

java.lang.AssertionError: Status expected:<200> but was:<404>
Expected :200
Actual   :404
  @WebMvcTest(RepositoryDetailsController.class)
  @ContextConfiguration(classes = RepositoryDetailsController.class)

 class RepositoryDetailsControllerTestt {
    @Autowired
    private MockMvc mvc;


    @MockBean
    private RepositoryDetailsService service;
    @InjectMocks
    private RepositoryDetailsController repositoryDetailsController;


   @Before
    public void setUp() {

        mvc = MockMvcBuilders.standaloneSetup(repositoryDetailsController).build();
    }

    @Test
    public void mockTest() throws Exception {

        RepositoryDetailsResponse details = new RepositoryDetailsResponse();
        details.setDescription("Ruby toolkit for the GitHub API");
        details.set"https://github.com/octokit/octokit.rb.git");
        details.setStars("57892");
        details.setName("octokit/octokit.rb");

        mvc.perform(get("repository/{owner}/{repository}","octokit","octokit.rb")
                .contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andDo(print())
                .andExpect(jsonPath("$.*", hasSize(5)))
                .andExpect(jsonPath("$.fullName").value(details.getName()))
                .andExpect(jsonPath("$.description").value(details.getDescription()))
                .andExpect(jsonPath("$.cloneUrl").value(details.getUrl()))
                .andExpect(jsonPath("$.stars").value(details.getStars()));
    }

【问题讨论】:

  • 你可以试试mvc.perform(get("/repository/{owner}/{repository}","octokit","octokit.rb")吗?另外,如果有.andDo(print()) 的输出就好了
  • 理想情况下,您不会在测试期间连接到实际资源——这样做意味着您的测试数据受服务器支配,这意味着您实际上无法测试 i> 因为你没有控制响应。这也意味着如果测试机器和服务器之间存在任何问题,您将进行非确定性测试。

标签: java spring testing junit mocking


【解决方案1】:

如果可以避免,您通常不希望在测试中连接到外部 API。拥有外部 API 测试依赖项会使生活变得更加困难,例如如果 API 出现故障或 API 发生重大更改怎么办?

您可以使用一些工具来模拟这个外部 API,在发出请求的同时硬编码预期的响应:

  • Wiremock - 非常通用,公开了一个模拟服务器,可以与任何进行 API 调用的库一起使用
  • Spring 的 MockRestServiceServer - 如果您的代码使用 RestTemplate 进行 API 调用,则特别有用
  • Test Containers - 如果你有一个提供模拟 API 的 Docker 镜像

在您的示例中,您似乎尝试使用 MockMvc 而不是 MockRestServiceServer,但没有足够的代码来说明您在做什么。

【讨论】:

    猜你喜欢
    • 2020-09-15
    • 2012-12-25
    • 2012-12-18
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多