Spring boot 使用Mockito模拟RestTemplate调用
我正在测试的方法中包含以下代码。我需要模拟这个Spring boot 使用Mockito模拟RestTemplate调用,spring-boot,junit,mockito,Spring Boot,Junit,Mockito,我正在测试的方法中包含以下代码。我需要模拟这个restemplate调用以获得可预测的结果 GitHubEmail[] gitHubEmails = restTemplate .getForObject(userEmailsUrl, GitHubEmail[].class, oAuthToken); 在测试方法中,我执行以下操作: RestTemplate mockRestTemplate = Mockito.mock(RestTemplate.class); GitHubE
restemplate
调用以获得可预测的结果
GitHubEmail[] gitHubEmails = restTemplate
.getForObject(userEmailsUrl, GitHubEmail[].class, oAuthToken);
在测试方法中,我执行以下操作:
RestTemplate mockRestTemplate = Mockito.mock(RestTemplate.class);
GitHubEmail fakeGitHubEmail = new GitHubEmail("testemail@email.com",
false, false, GitHubEmailVisibility.PRIVATE);
GitHubEmail[] fakeEmails = {fakeGitHubEmail};
Mockito.when(mockRestTemplate.getForObject(
Mockito.eq(userUrl),
Mockito.eq(GitHubEmail[].class),
Mockito.eq(testOAuthToken)))
.thenReturn(fakeEmails);
gitHubService.setRestTemplate(mockRestTemplate);
User user = gitHubService.getUser(testOAuthToken);
事情不像我期望的那样顺利。。。当我在测试的方法中检查gitHubEmails
变量时,它是null
为什么不工作?当前的代码不包含任何错误。但是,有两件事我们在给定的代码中看不到:
testOAuthToken
被正确地传递给githubService
中的oAuthToken
变量userUrl
被传递到githubService
中的userEmailsUrl
userUrl
,另一个属性userEmailsUrl
,则可能存在错误
通常,当我遇到这些容易出错的模拟情况时,我在模拟时使用“any matchers”(any()
,anyString()
,…),然后在调用和断言之后,使用Mockito.verify()
检查参数是否匹配:
Mockito.when(mockrestemplate.getForObject(
Mockito.anyString(),//使用anyString()
Mockito.eq(GitHubEmail[].class),
Mockito.anyString())//使用anyString()
.然后返回(传真);
//调用+断言。。。
验证(mockRestTemplate).getForObject(
Mockito.eq(userUrl),//使用eq()
Mockito.eq(GitHubEmail[].class),
Mockito.eq(testOAuthToken));//使用eq()
原因是verify()
输出提供了更多的反馈。它不仅会失败,而且会在以下情况下说明失败的原因:
- 使用不同的参数调用mock方法,以及哪些参数
- 模拟对象有不同的方法被调用
userUrl
作为userEmailsUrl
正确地传递给githubService
吗?@g00glen00b我想是这样的。这个值是通过Spring从同一个属性文件连接进来的。。。你是对的。我在连接用户URL而不是用户电子邮件URL。。。老兄,这些愚蠢的错误让你追了这么久。谢谢我会给你点意见,但不知道如何通过评论。也许在回复中写同样的东西,我会选择它作为答案。谢谢有时候你只需要第二双眼睛,我想。没问题,我自己也遇到过几次这样的错误。我不只是复制粘贴我的评论,我还发布了一些反馈,告诉你如何更容易在我的答案中发现这些错误。答案中还有更多的附加值。谢谢这很有帮助!