java - 非弹簧应用程序中resttemplate的Junit
问题描述
我正在开发一个非 Spring 应用程序并使用 spring-web 中的 restTemplate 功能。在编写 Junit 测试时,我无法模拟来自 restTemplate.postForEntity() 的响应。我在这里做错了什么。
下面是函数
public JsonObject apiResponse(Request request) throws JsonProcessingException {
String queryRequest = objectMapper.writeValueAsString(request);
HttpHeaders headers = new HttpHeaders();
headers.add("content-type", "application/json");
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> responseEntity = restTemplate.postForEntity(
"https://testurl/test/",
new HttpEntity<>(queryRequest, headers), String.class);
return JsonParser.parseString(Objects.requireNonNull(responseEntity.getBody())).getAsJsonObject();
下面是朱尼特
@ExtendWith(MockitoExtension.class)
public class HandlerTest {
@Spy
@InjectMocks
Handler handler;
@Mock
RestTemplate restTemplate;
@Test
public void apiREsponseTest() throws JsonProcessingException {
//this is not working
Mockito.doReturn(new ResponseEntity <>("test", HttpStatus.OK))
.when(restTemplate).postForEntity(eq("test"), eq(HttpEntity.class), eq(String.class));
assertNotNull(handler.apiResponse(request));
解决方案
RestTemplate restTemplate = new RestTemplate();
这不会被嘲笑,因为它是一个本地对象,它总是会调用真正的方法。你可以试试这个来模拟restTemplate:
RestTemplate restTemplate = getRestTemplate();
protected RestTemplate getRestTemplate() {
return new RestTemplate();
}
//Add this stub to your test
when(handler.getRestTemplate()).thenReturn(restTemplate);
URL 在这里被硬编码:
ResponseEntity<String> responseEntity = restTemplate.postForEntity(
"https://testurl/test/",
new HttpEntity<>(queryRequest, headers), String.class);
因此,您还需要更改存根。
Mockito.doReturn(new ResponseEntity <>("test", HttpStatus.OK))
.when(restTemplate).postForEntity(eq("https://testurl/test/"), eq(HttpEntity.class), eq(String.class));
进行这些更改应该可以使您的测试变绿。如果这不能解决您的问题,请告诉我。
推荐阅读
- join - Nifi: How to concatenate flowfile to already existing tables in a directory?
- ios - 关于在 Swift 中删除 ios 照片资源的问题
- javascript - 从另一个屏幕导航后如何重新加载页面
- javascript - 动态传递未知数量的参数以响应路由器
- sql - 在scandate列中插入时间戳列?
- heroku - heroku-18 中启动 Chrome 无头 = false 的必要构建包
- python - 如何在 Keras 功能 API 中使用逐元素乘法训练来组合 2 个向量?
- css - 引导网格 - 扩展背景颜色
- android - 如何从 Environment.DIRECTORY_PICTURE 目录中获取所有图像并显示在我的自定义画廊中
- ruby - 在Ruby中使用方括号调用函数时如何获取args