这是我的控制人员:
@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));
}
但它似乎没有嘲笑任何东西。控制器仍在响应外部服务。
答案 0 :(得分:2)
我猜你的RestTemplate声明如下所示
@Mock
RestTemplate restTemplate;
原因是@Mock在这个类中创建了一个模拟实例。不在您的实际控制器类中创建。
在这种情况下,您可以使用MockRestServiceServer类来模拟RestTemplate类。
以下是MockResrServiceServer的声明
@Autowired
MockRestServiceServer mockServer;
以下是mockServer的初始化
mockServer = MockRestServiceServer.createServer(restTemplate);
}
而且,这是建立期望和模拟回应。
mockServer.expect(requestTo("http://exleft-URL.com"))
.andExpect(method(HttpMethod.GET))
.andRespond(withSuccess("resultSuccess"));
以上只是您必须为测试代码安排它们的示例。