Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何编写测试以便控制器可以连接到API?_Java_Spring_Testing_Junit_Mocking - Fatal编程技术网

Java 如何编写测试以便控制器可以连接到API?

Java 如何编写测试以便控制器可以连接到API?,java,spring,testing,junit,mocking,Java,Spring,Testing,Junit,Mocking,我正在尝试处理RESTAPI测试。 我代码中的控制器连接到外部api解析,并以JSON的形式返回。 我正在尝试运行一个测试,以便它返回应用程序逻辑的结果。 不幸的是,在测试期间,我无法连接到api github 如果可以避免,您通常不希望在测试中连接到外部API。拥有外部API测试依赖关系会让生活变得更加艰难,例如,如果API出现故障,或者如果API发生了重大变化,该怎么办 您可以使用很少的工具来模拟此外部API,在发出请求的同时对预期响应进行硬编码: -非常通用,公开了一个模拟服务器,可与任

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


如果可以避免,您通常不希望在测试中连接到外部API。拥有外部API测试依赖关系会让生活变得更加艰难,例如,如果API出现故障,或者如果API发生了重大变化,该怎么办

您可以使用很少的工具来模拟此外部API,在发出请求的同时对预期响应进行硬编码:

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

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

如果可以避免,您通常不希望在测试中连接到外部API。拥有外部API测试依赖关系会让生活变得更加艰难,例如,如果API出现故障,或者如果API发生了重大变化,该怎么办

您可以使用很少的工具来模拟此外部API,在发出请求的同时对预期响应进行硬编码:

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

在您的示例中,您似乎试图使用
MockMvc
而不是
MockRestServiceServer
,但是没有足够的代码来准确地告诉您正在做什么。

您可以尝试使用
mvc.perform(get(“/repository/{owner}/{repository}”,“octokit”,“octokit.rb”)
?另外,如果有
的输出,您也会很高兴(打印())
理想情况下,在测试过程中,您不会连接到实际的资源——这样做意味着您的测试数据受服务器支配,这意味着您无法进行实际测试,因为您无法控制响应。这也意味着如果测试机和服务器之间存在任何问题,您将进行非确定性测试。您可以尝试使用wi吗th
mvc.perform(get(“/repository/{owner}/{repository}”、“octokit”、“octokit.rb”)
?另外,如果有
.andDo(print())的输出也很好
理想情况下,在测试过程中,您不会连接到实际的资源——这样做意味着您的测试数据受服务器支配,这意味着您无法进行实际测试,因为您无法控制响应。这还意味着如果测试机和服务器之间存在任何问题,您将进行非确定性测试。
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()));
    }