模拟restTemplate的问题

时间:2017-01-06 12:11:24

标签: java unit-testing spring-boot mockito

这是我的控制人员:

    @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));
}

但它似乎没有嘲笑任何东西。控制器仍在响应外部服务。

1 个答案:

答案 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"));

以上只是您必须为测试代码安排它们的示例。