mockito 模拟休息模板.postForEntity

yqhsw0fo  于 2022-12-13  发布在  其他
关注(0)|答案(6)|浏览(313)

我试图模仿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);

这是行不通的;我试过其他几种排列,也没有成功。任何建议都很感激,谢谢。
我所说的不起作用是指调用的是实际的方法而不是模拟的方法(因此不返回所需的结果等)。

cld4siwp

cld4siwp1#

下面的代码对我有效-when(mockRestTemplate.postForEntity(anyString(), any(), eq(String.class))).thenReturn(response);

f45qwnt8

f45qwnt82#

这对我来说是有效的首先一个resttemplate需要在测试类中被模仿

@Mock 
private RestTemplate mockRestTemplate;

由于ResponseEntity返回一个Object,因此创建另一个方法,该方法返回 Package 在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));
fhg3lkii

fhg3lkii3#

我猜postForEntity方法是final方法--您可以使用RestOperations代替RestTemplate来解决这个问题。

ifsvaxew

ifsvaxew4#

您可以使用MockRestServiceServer进行测试,然后它将返回模拟响应,无论您使用什么RestTemplate方法或其重载来调用POST-postForEntitypostForObjectexchange
例如:

@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);                                                        
    }
}

更多详情:测试客户端应用程序

polkgigr

polkgigr5#

您必须确保在测试中将restTemplate初始化为mock

RestTemplate restTemplate = mock(RestTemplate.class);

并且这个(模拟的)rest模板是在实际方法调用中使用的模板。您可以在对象上有一个setRestTemplate()方法,并且可以使用该方法来设置restTemplate:

myTestObject.setRestTemplate(restTemplate);

mock绝不会只调用原始方法,所以如果发生这种情况,你可以非常肯定你的实际方法没有使用mock。(真实的)mock要么返回你告诉它们的东西,要么返回null。

mzsu5hc0

mzsu5hc06#

剩余模板返回响应实体
如果是这样的话,那么就像是响应实体,我的响应= restTemplate.postForEntity(我的URI,我的实体,字符串到返回。其中StringToReturn是要返回的任何类型(在本例中仅为String)

相关问题