我试图模仿restTemplate.postForEntity
方法,
实际方法调用是:
URI myUri = new URI(myString);
HttpEntity<String> myEntity ...
String myResponse = restTemplate.postForEntity(myUri, myEntity, String.class);
我的测试类是:
Mockito.when(restTemplate.postForEntity(any(URI.class), any(HttpEntity.class), eq(String.class))).thenReturn(response);
这行不通;我也尝试过其他几种排列方式,但都没有成功。如有任何建议,欢迎。
我的意思是调用实际方法而不是模拟方法(因此不返回所需的结果等)
下面的代码为我工作when(mockRestTemplate.postForEntity(anyString(), any(), eq(String.class))).thenReturn(response);
我就是这么做的首先,需要在测试类
中模拟resttemplate@Mock
private RestTemplate mockRestTemplate;
由于ResponseEntity返回一个对象,创建另一个方法,返回包装在ResponseEntity
中的预期响应private ResponseEntity<Object> generateResponseEntityObject(String response, HttpStatus httpStatus){
return new ResponseEntity<>(response, httpStatus);
}
在您的测试用例中,您现在可以模拟预期的响应,如下所示
String string = "result";
when(mockRestTemplate.postForEntity(anyString(), any(), any()))
.thenReturn(generateResponseEntityObject(string, HttpStatus.OK));
我猜postForEntity
方法是最终的-你可以使用RestOperations
而不是RestTemplate
来解决这个问题。
您可以使用MockRestServiceServer进行测试。然后它将返回模拟响应,无论您使用什么RestTemplate方法或它的重载用于POST
调用- postForEntity
, postForObject
或exchange
。
@SpringBootTest
public class YourServiceTest {
@Autowired
private YourService yourService;
@Autowired
private RestTemplate restTemplate;
private MockRestServiceServer mockServer;
@BeforeEach
public void setUp() {
mockServer = MockRestServiceServer.createServer(restTemplate);
}
@Test
public void methodWithPostCallTest() {
mockServer.expect(ExpectedCount.once(),
requestTo(new URI("post-method-url")))
.andExpect(method(HttpMethod.POST))
.andRespond(withStatus(HttpStatus.OK)
.contentType(MediaType.APPLICATION_JSON)
.body("mock-response-body")
);
String response = yourService.methodWhichExecutesPost();
mockServer.verify();
assertEquals("mock-response-body", response);
}
}
更多细节:测试客户端应用程序
您必须确保在测试中将restTemplate初始化为模拟
RestTemplate restTemplate = mock(RestTemplate.class);
并且这个(模拟的)rest模板是在实际方法调用中使用的模板。你可以在你的对象上有一个setRestTemplate()方法,你可以用它来设置restTemplate:
myTestObject.setRestTemplate(restTemplate);
模拟将永远不会只是调用原始方法,所以如果发生这种情况,您可以非常确定您的实际方法没有使用模拟。(真实的)mock要么返回您告诉它们的内容,要么返回null。
resttemplate返回ResponseEntity
Postforentity所以像ResponseEntitymyResponse=创建restTemplate。postForEntity(myUri, myEntity, StringToReturn.class);其中StringToReturn是要返回的任何类型(在您的例子中只是字符串)