这是我的控制器:
@RequestMapping(
value = "/{owner}/{repositoryName}",
method = RequestMethod.GET,
produces = "application/json"
)
public RepoInfo repoInfo(@PathVariable String owner, @PathVariable String repositoryName) {
return restTemplate.getForObject(githubApiUrl + owner + "/" + repositoryName, RepoInfo.class);
}
以下是测试方法:
@Before
public void mockGithubApiResponse() {
Mockito.when(restTemplate.getForObject(githubApiUrl + dummyOwner + "/" + dummyRepoName, RepoInfo.class)).thenReturn(dummyRepoInfoObject);
}
@Test
public void shouldReturnRepoInfoObject() throws Exception {
Gson gson = new Gson();
String jsonRepo = gson.toJson(dummyRepoInfoObject);
this.mockMvc.perform(get("http://localhost:" + this.port + "/" + repoControllerMappingPrefix + dummyOwner + "/" + dummyRepoName)
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().json(jsonRepo));
}
但它似乎并没有嘲笑任何东西。控制器仍在根据外部服务进行响应。
我想你的 RestTemplate 声明如下所示
@Mock
RestTemplate restTemplate;
原因是@Mock在此类中创建模拟实例。 不会在实际控制器类中创建。
在这种情况下,您可以使用 MockRestServiceServer 类来模拟 RestTemplate 类。
以下是 MockResrServiceServer 的声明
@Autowired
MockRestServiceServer mockServer;
以下是模拟服务器的初始化
mockServer = MockRestServiceServer.createServer(restTemplate);
}
而且,这是建立期望和模拟反应。
mockServer.expect(requestTo("http://exleft-URL.com"))
.andExpect(method(HttpMethod.GET))
.andRespond(withSuccess("resultSuccess"));
以上只是一个示例,您必须为测试代码安排它们。