Java 如何编写测试以便控制器可以连接到API?
我正在尝试处理RESTAPI测试。 我代码中的控制器连接到外部api解析,并以JSON的形式返回。 我正在尝试运行一个测试,以便它返回应用程序逻辑的结果。 不幸的是,在测试期间,我无法连接到api githubJava 如何编写测试以便控制器可以连接到API?,java,spring,testing,junit,mocking,Java,Spring,Testing,Junit,Mocking,我正在尝试处理RESTAPI测试。 我代码中的控制器连接到外部api解析,并以JSON的形式返回。 我正在尝试运行一个测试,以便它返回应用程序逻辑的结果。 不幸的是,在测试期间,我无法连接到api github 如果可以避免,您通常不希望在测试中连接到外部API。拥有外部API测试依赖关系会让生活变得更加艰难,例如,如果API出现故障,或者如果API发生了重大变化,该怎么办 您可以使用很少的工具来模拟此外部API,在发出请求的同时对预期响应进行硬编码: -非常通用,公开了一个模拟服务器,可与任
如果可以避免,您通常不希望在测试中连接到外部API。拥有外部API测试依赖关系会让生活变得更加艰难,例如,如果API出现故障,或者如果API发生了重大变化,该怎么办 您可以使用很少的工具来模拟此外部API,在发出请求的同时对预期响应进行硬编码:
- -非常通用,公开了一个模拟服务器,可与任何进行API调用的库一起使用
- Spring的-如果您的代码正在使用
进行API调用,则特别有用RestTemplate
- -如果您有提供模拟API的Docker映像
在您的示例中,您似乎试图使用
MockMvc
而不是MockRestServiceServer
,但没有足够的代码来准确说明您正在做什么。如果可以避免,您通常不希望在测试中连接到外部API。拥有外部API测试依赖关系会让生活变得更加艰难,例如,如果API出现故障,或者如果API发生了重大变化,该怎么办
您可以使用很少的工具来模拟此外部API,在发出请求的同时对预期响应进行硬编码:
- -非常通用,公开了一个模拟服务器,可与任何进行API调用的库一起使用
- Spring的-如果您的代码正在使用
进行API调用,则特别有用RestTemplate
- -如果您有提供模拟API的Docker映像
在您的示例中,您似乎试图使用
MockMvc
而不是MockRestServiceServer
,但是没有足够的代码来准确地告诉您正在做什么。您可以尝试使用mvc.perform(get(“/repository/{owner}/{repository}”,“octokit”,“octokit.rb”)
?另外,如果有的输出,您也会很高兴(打印())
理想情况下,在测试过程中,您不会连接到实际的资源——这样做意味着您的测试数据受服务器支配,这意味着您无法进行实际测试,因为您无法控制响应。这也意味着如果测试机和服务器之间存在任何问题,您将进行非确定性测试。您可以尝试使用wi吗thmvc.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()));
}