Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 使用Mockito模拟RestTemplate调用_Spring Boot_Junit_Mockito - Fatal编程技术网

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。。。老兄,这些愚蠢的错误让你追了这么久。谢谢我会给你点意见,但不知道如何通过评论。也许在回复中写同样的东西,我会选择它作为答案。谢谢有时候你只需要第二双眼睛,我想。没问题,我自己也遇到过几次这样的错误。我不只是复制粘贴我的评论,我还发布了一些反馈,告诉你如何更容易在我的答案中发现这些错误。答案中还有更多的附加值。谢谢这很有帮助!