Mockito mocking restTemplate.postForEntity



我试图模仿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, postForObjectexchange

例如:

@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是要返回的任何类型(在您的例子中只是字符串)

相关内容

  • 没有找到相关文章

最新更新