程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了当 RestTemplate大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决当 RestTemplate?

开发过程中遇到当 RestTemplate的问题如何解决?下面主要结合日常开发的经验,给出你关于当 RestTemplate的解决方法建议,希望对你解决当 RestTemplate有所启发或帮助;

我尝试测试一个简单的 POST Rest 调用,但存在 NullPointerException。

我的 RestController:

@RestController
@requestMapPing("/v1/mail")
@Slf4j
public class EmailForWARDController {

    @autowired
    EmailForWARDConfig emailConfig;

    @autowired
    RestTemplate restTemplate;

    @PostMapPing("/forWARD")
    public ResponseEntity<String> setupEmailForWARD(@requestParam String fromEmail,@requestParam String toEmail,@requestParam String referencEID) {
        log.info("Email ForWARD: from=" + fromEmail + " to=" + toEmail + " reference=" + referencEID);
        String uri = emailConfig.getUrl() + "forWARD";
        JsONObject JsonObject = new JsONObject();
        JsonObject.put("from",fromEmail);
        JsonObject.put("to",toEmail);
        JsonObject.put("clIEntID",referencEID);
        httpentity<String> httpentity = new httpentity<>(JsonObject.toJsONString());
        ResponseEntity<String> response = restTemplate.postForEntity(uri,httpentity,String.class);
        System.out.println(responsE); // -> this is null at UNIT Test
        if (response.getbody() == null) {
            log.error("No response for call!");
            return new ResponseEntity<>("Problem!",httpStatus.INTERNAL_SERVER_ERROR);
        }
        return new ResponseEntity<>(response.getbody(),response.getStatusCode());

    }

}

我的单元测试:

@RunWith(mockitoJUnitRunner.class)
@SpringBoottest(classes = EmailForWARD.class,webEnvironment = SpringBoottest.WebEnvironment.defineD_PORT)
public class serviCETest {

    @Injectmocks
    EmailForWARDController emailForWARDController;

    @mock
    RestTemplate restTemplate;

    @mock
    EmailForWARDConfig emailConfig;

    @Before
    public voID setup() {

    }

    @Test
    public voID test_forWARD_ok() {
        assertNotNull(restTemplatE);
        assertNotNull(emailForWARDController);
//        System.out.println(mockito.verify(restTemplatE).postForEntity(any(),any(),any()));
        mockito.when(restTemplate.postForEntity(any(),any())).thenReturn(new ResponseEntity<>("done",httpStatus.OK));
        ResponseEntity<String> responseEntity = emailForWARDController.setupEmailForWARD("test","test","test");
        assertNotNull(responseEntity);
        assertNotNull(responseEntity.getStatusCode());
        assertNotNull(responseEntity.getbody());
        assertEquals(responseEntity.getbody(),"Done");
        assertEquals(responseEntity.getStatusCode(),httpStatus.OK);
    }


}

由于以下错误,此测试失败:NullPointerException,正是响应 ResponseEntity 对象为空。

验证输出显示:

Wanted but not invoked:
restTemplate.postForEntity(
    <any>,<any>,<any>
);
-> at xx.xxx.ms.oauth2.serviCETest.test_forWARD_ok(serviCETest.java:42)
Actually,there were zero interactions with this mock.

任何想法为什么响应为空?我为测试使用了正确的注释,因此应该注入模拟。也许我在这里遗漏了一些重要的东西,因为如果我删除 @mock EmailForWARDConfig emailConfig; 这个对象在 RestController 中为空。 我觉得我忘记了一些东西,但我想不通。

解决方法

你对 restTemplate.postForEntity 的嘲讽是不正确的。

改变你的模拟:

mockito.when(restTemplate.postForEntity(any(),any(),any())).thenReturn(new ResponseEntity<>("done",httpStatus.OK));

到:

mockito.when(restTemplate.postForEntity(anyString(),any(Class.class))).thenReturn(new ResponseEntity<>("done",httpStatus.OK));

我试过了

@ExtendWith(mockitoExtension.class)
public class TESTControllerTest {

    @Injectmocks
    TESTController emailForWARDController;
    @mock
    RestTemplate restTemplate;

    @Before
    public void setup() {

    }

    @Test
    public void test_forWARD_ok() {
        assertNotNull(restTemplatE);
        assertNotNull(emailForWARDController);
//        System.out.println(mockito.verify(restTemplatE).postForEntity(any(),any()));
        mockito.when(restTemplate.postForEntity(anyString(),httpStatus.OK));
        ResponseEntity<String> responseEntity = emailForWARDController.setupEmailForWARD("test","test","test");
        assertNotNull(responseEntity);
        assertNotNull(responseEntity.getStatusCode());
        assertNotNull(responseEntity.getBody());
        assertEquals(responseEntity.getBody(),"done");
        assertEquals(responseEntity.getStatusCode(),httpStatus.OK);
    }
}
,

发现问题似乎变量的顺序有所不同,需要检查文档。

@mock 应该在@Injectmocks 之前


    @mock
    RestTemplate restTemplate;

    @Injectmocks
    TESTController emailForWARDController;

大佬总结

以上是大佬教程为你收集整理的当 RestTemplate全部内容,希望文章能够帮你解决当 RestTemplate所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: