大佬教程收集整理的这篇文章主要介绍了当 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
RestTemplate restTemplate;
@Injectmocks
TESTController emailForWARDController;
以上是大佬教程为你收集整理的当 RestTemplate全部内容,希望文章能够帮你解决当 RestTemplate所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。