非 spring 应用程序中用于 resttemplate 的 Junit
Junit for resttemplate in a non spring application
我正在开发一个非 spring 应用程序并使用来自 spring-web.While 的 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();
下面是Junit
@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));
进行这些更改应该会使您的测试充满希望。如果这不能解决您的问题,请告诉我。
我正在开发一个非 spring 应用程序并使用来自 spring-web.While 的 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();
下面是Junit
@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));
进行这些更改应该会使您的测试充满希望。如果这不能解决您的问题,请告诉我。