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

如何模拟RestTemplate Exchange Spring Boot

蒲深
2023-03-14

我尝试了很多方法来模拟restTemboard交换,但模拟没有发生,实际的交换不断调用并给我url无效异常。

我的CallRestService方法如下

public class Util{
    
    public static ResponseEntity<String> callRestService(JSONObject reqJsonObj,HttpHeaders headers, String url, HttpMethod method, boolean isAuto){
        ResponseEntity<String> re=null;
        try{
            HttpEntity<String> entity=null;
            entity=new HttpEntity<>(String.valueOf(reqJsonObj),headers);
            RestTemplate restTemplate= new RestTemplate();
            re=restTemplate.exchange(url,method,entity,String.class);
        }catch(Exception e){
            System.out.println(e);
        }
    }
}

我的模拟如下:

public class UtilTest{
    @InjectMocks
    Util util;
    @Mock
    RestTemplate restTemplate;
    ResponseEntity res=mock(ResponseEntity.class);

    @Test
    public void test(){
        //ResponseEntity<String> entity=new ResponseEntity<String>("anySt",HttpStatus.ACCEPTED);
        Mockito.when(restTemplate.exchange(
                ArgumentMatchers.anyString(),
                ArgumentMatchers.any(HttpMethod.class),
                ArgumentMatchers.any(HttpEntity.class),
                ArgumentMatchers.<Class<String>>any())
        ).thenReturn(res);
        Util.callRestService(json,headers,url,HttpMethod.POST,false);
    }
}

我还尝试返回已注释的响应实体。但每次都会有例外。

我对mocking的理解是,不会调用实际的exchange方法,那么我如何获得resttemplate exchange异常。

如果需要任何输入,请评论。

谢谢你的支持。

更新:我尝试将静态方法更改为非静态,但保持测试用例不变。但是我得到了同样的错误

共有1个答案

詹弘毅
2023-03-14

当我将方法更新为非静态并将Rest模板声明移到方法之外时,问题就解决了。

更新的代码如下,如果有人发现它很有用。

方法更改:

public class Util{
    private RestTemplate restTemplate= new RestTemplate();
    public ResponseEntity<String> callRestService(JSONObject reqJsonObj,HttpHeaders headers, String url, HttpMethod method, boolean isAuto){
        ResponseEntity<String> re=null;
        try{
            HttpEntity<String> entity=null;
            entity=new HttpEntity<>(String.valueOf(reqJsonObj),headers);
            re=restTemplate.exchange(url,method,entity,String.class);
        }catch(Exception e){
            System.out.println(e);
        }
    }
}

以及模拟验证:

public class UtilTest{
    @InjectMocks
    Util util;
    @Mock
    RestTemplate restTemplate;

    @Test
    public void test(){
        ResponseEntity<String> entity=new ResponseEntity<String>("anySt",HttpStatus.ACCEPTED);
        Mockito.when(restTemplate.exchange(
                ArgumentMatchers.anyString(),
                ArgumentMatchers.any(HttpMethod.class),
                ArgumentMatchers.any(HttpEntity.class),
                ArgumentMatchers.<Class<String>>any())
        ).thenReturn(entity);

        Util.callRestService(json,headers,url,HttpMethod.POST,false);

        Mockito.verify(restTemplate,times(1)).exchange(
                ArgumentMatchers.anyString(),
                ArgumentMatchers.any(HttpMethod.class),
                ArgumentMatchers.any(HttpEntity.class),
                ArgumentMatchers.<Class<String>>any())
        )
    }
}
 类似资料:
  • CacheController.Somemethod();但是当submit方法被称为submit方法时,它会创建一个线程和cacheController.somemethod();从不调用测试类。

  • 当我运行测试时,我可以做什么来更改时间

  • null 我看过其他几个类似的问题,但没有一个有帮助: 模拟包含对SQLiteOpenHelper引用的类时出错 使用mockito库在java中模拟最终类-我在导入PowerMock时遇到了很多问题 如何用mockito模拟最后一个类-我已经添加了依赖项,并用行创建了文件,正如答案中所建议的那样,我仍然得到同样的错误。我还尝试了建议的答案,但这给了我一个‘没有足够的信息来推断类型变量t'erro

  • 我的要求是测试这段代码,更重要的是测试序列化器,因此,给出一个JSON片段,我如何测试所有的值都正确地通过商人的实例。 我不知道RestTemplate使用哪个序列化器将JSON序列化为对象。

  • 我知道Dan North设计BDD的意图之一是将词汇表从复杂的测试域中移开。然而,在实现由外到内的方法时,我们似乎仍然需要对模仿行为(或者,如果您愿意的话)有一些了解。North在这个视频中建议,如果我从最外层的域对象开始,然后向内工作,我会在发现合作者时模仿它们,然后用适当的实现替换它们。所以最后,我以一组端到端测试结束。 Martin Fowler在这篇博客文章中定义了TDD的两个阵营:“古典

  • 问题内容: 在我的测试案例中,我需要测试时间敏感的方法,在该方法中,我们使用的是Java 8类LocalDate,而 不是Joda 。 运行测试时,我该如何更改时间? 问题答案: 在您的代码中,将替换为。 然后,您可以通过生产并使用固定时钟进行测试。 这是一个例子: 首先,注入。如果您使用的是Spring Boot,请执行以下操作: 其次,输入您的代码: 现在,在单元测试类中:

  • 它返回null,而不是预期的客户端,对象类的工作正常。我只想写测试。我是漏掉了什么还是做错了测试?谢谢你的指导。

  • 问题内容: 在我的代码中,我有这样的东西: 如何在junit测试中“模拟”它以返回特定日期? 问题答案: 就我所知,您有三个明智的选择: 将实例插入您当天设置的任何方法/类中。 使用JodaTime而不是。这不是一个选择,而是一个建议,因为JodaTime将使您的生活更加轻松。您仍然需要将此时间注入该方法中。 包装在一些界面中,可以让您获取时间。然后,您只需模拟该接口并使其返回常量即可。