当前位置: 首页 > 知识库问答 >
问题:

如何模拟REST模板交换?

焦同
2023-03-14

我有一项服务,我需要通过rest向外部服务器询问一些信息:

public class SomeService {

    public List<ObjectA> getListofObjectsA() {
        List<ObjectA> objectAList = new ArrayList<ObjectA>();
        ParameterizedTypeReference<List<ObjectA>> typeRef = new ParameterizedTypeReference<List<ObjectA>>() {};
        ResponseEntity<List<ObjectA>> responseEntity = restTemplate.exchange("/objects/get-objectA", HttpMethod.POST, new HttpEntity<>(ObjectAList), typeRef);
        return responseEntity.getBody();
    }
}

如何为getListofObjectsA()编写JUnit测试?

我尝试了以下方法:

@RunWith(MockitoJUnitRunner.class)
public class SomeServiceTest {
    private MockRestServiceServer mockServer;

    @Mock
    private RestTemplate restTemplate;

    @Inject
   private SomeService underTest;

@Before
public void setup() {
    mockServer = MockRestServiceServer.createServer(restTemplate);
    underTest = new SomeService(restTemplate);
    mockServer.expect(requestTo("/objects/get-objectA")).andExpect(method(HttpMethod.POST))
            .andRespond(withSuccess("{json list response}", MediaType.APPLICATION_JSON));
}

    @Test
    public void testGetObjectAList() {
    List<ObjectA> res = underTest.getListofObjectsA();
    Assert.assertEquals(myobjectA, res.get(0));
}

然而,上面的代码不起作用,它表明responseEntitynull。如何更正测试以正确模拟restTemplate。交换?

共有3个答案

冯鸿哲
2023-03-14
ResponseEntity<String> responseEntity = new ResponseEntity<String>("sampleBodyString", HttpStatus.ACCEPTED);
when(restTemplate.exchange(
                           Matchers.anyString(), 
                           Matchers.any(HttpMethod.class),
                           Matchers.<HttpEntity<?>> any(), 
                           Matchers.<Class<String>> any()
                          )
                         ).thenReturn(responseEntity);
邓卓
2023-03-14

这是一个未弃用的ArgumentMatcher类的示例

when(restTemplate.exchange(
                ArgumentMatchers.anyString(),
                ArgumentMatchers.any(HttpMethod.class),
                ArgumentMatchers.any(),
                ArgumentMatchers.<Class<String>>any()))
             .thenReturn(responseEntity);
凌啸
2023-03-14

您不需要MockRestServiceServer对象。注释是InjectMocks,而不是InjectMocks。下面是一个应该可以工作的示例代码

@RunWith(MockitoJUnitRunner.class)
public class SomeServiceTest {
    @Mock
    private RestTemplate restTemplate;

    @InjectMocks
    private SomeService underTest;

    @Test
    public void testGetObjectAList() {
        ObjectA myobjectA = new ObjectA();
        //define the entity you want the exchange to return
        ResponseEntity<List<ObjectA>> myEntity = new ResponseEntity<List<ObjectA>>(HttpStatus.ACCEPTED);
        Mockito.when(restTemplate.exchange(
            Matchers.eq("/objects/get-objectA"),
            Matchers.eq(HttpMethod.POST),
            Matchers.<HttpEntity<List<ObjectA>>>any(),
            Matchers.<ParameterizedTypeReference<List<ObjectA>>>any())
        ).thenReturn(myEntity);

        List<ObjectA> res = underTest.getListofObjectsA();
        Assert.assertEquals(myobjectA, res.get(0));
    }
 类似资料:
  • 我现在在运行时看到.Intercept正在获得null对象值。 有人能建议我怎么修理吗。

  • 我在JUnit中使用Mockito,并且我有一个使用RestTemboard向微服务发出请求的方法。 此方法返回一个JSON对象,该对象将在TokenRequestorPayload类中反序列化。 当我执行单元测试时,它们会失败,因为mock不起作用,我得到了一个org.springframework.web.client.ResourceAccessExcure。我怎么能嘲笑我的RestTem板

  • Spring参考提到应该通过进行定制。如何用一个构建器管理来自多个IP地址的多个URI? 如何通过向所有全局添加,这是一个好的实践吗? 多谢帮忙。 我考虑为每个服务器设置一个。我不想手动执行此操作--我更喜欢使用Spring机制。 有人帮忙吗?

  • 我需要对一个方法进行unittest,该方法有2个rest调用和另一个方法调用。详细描述如下: 现在,对于methB和methC方法,我用这里给出的解决方案模拟了rest调用。但是使用methA()我无法为两种不同类型(GET和POST)的两个不同REST调用修补mock。模拟此场景的可能解决方案是什么?提前通知。

  • 我实现了一个模块来使用rest webservice(Json)并在oracle数据库中持久化。我只在Spring IOC上工作,但可以使用Spring BootRest模板和Spring数据JPA快速开发它。班级数量非常少。 对于json到java对象的转换,我使用http://www.jsonschema2pojo.org/并将所有生成的java对象复制到我的项目中。现在,我想包括logic/

  • 我试图理解restTemplate上可用的readTimeout,它到底是什么? 它是请求在我们得到超时异常之前可以花费的总时间吗?