亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我如何模擬 Rest Template 的 getForEntity() 方法

我如何模擬 Rest Template 的 getForEntity() 方法

UYOU 2023-03-09 15:08:29
我是 mockito 的新手,需要一些幫助,可能是一些關于如何模擬 Rest Template 的 getForEntity 和 postForEntity 方法的示例。下面是我想通過模擬 getForEntity 方法為其編寫 Junit 測試用例的代碼。SomeService.javaclass SomeService{   //some private, static,  final data members   public Map getService(String sNo, String uId, String en)   {      ResponseEntity <Map> response = new       RestTemplate().getForEntity("https://someurl.com/someService",       Map.class);      Map body = response.getBody();      //do something      HttpEntity<?> request = new HttpEntity <>(payLoad, headers);      //payload is Hash Map and headers is a LinkedMultiValueMap      ResponseEntity <Map> response = new RestTemplate().postForEntity(url,       request, headers);      return response.getBody();    }   }我嘗試用@Mock 和@InjectMocks 做一些事情。TestSomeService.java@RunWith(MockitoJunitRunner.class)class TestSomeService{   @Mock   RestTemplate restTemplate;   @InjectMocks   SomeService ser;   /*Some data members*/   @Before   {      HttpEntity <?> request = new HttpEntity<>(reqPayload, headers);      Mockito.when(restTemplate.getForEntity("theUrl",       Map.class)).thenReturn(new ResponseEntity <Map>(someMap,       HttpStatus.OK));      Mockito.when(restTemplate.postForEntity("anotherUrl", request,       Map.class)).thenReturn(new ResponseEntity <Map>(expectedMap,       HttpStatus.OK));   }     @Test   public void testGetService()   {       Map <String, Object> result = ser.getService("123", "abc", "QA");   }    }
查看完整描述

5 回答

?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

當你調用特定值時,你必須用ArgumentMatchers.eq(). 但是,您也可以使用anyString(),any(Class class)和其他。它們都是不言自明的。模擬教程。

@Before

public void init (){

    MockitoAnnotations.initMocks(this);


    HttpEntity <?> request = new HttpEntity<>(reqPayload, headers);


    Mockito.when(restTemplate.getForEntity(ArgumentMatchers.eq("theUrl"),ArgumentMatchers.any(Map.class)))

            .thenReturn(new ResponseEntity <Map>(someMap, HttpStatus.OK));

}

關于你的結構。這樣你就可以RestTemplate通過構造函數注入。


public class ServiceTester {


    @Mock

    private RestTemplate restTemplate;


    private Service service;


    @Before

    public void init (){

        MockitoAnnotations.initMocks(this);


        service = new Service(restTemplate);


        HttpEntity <?> request = new HttpEntity<>(reqPayload, headers);


        Mockito.when(restTemplate.getForEntity(ArgumentMatchers.eq("theUrl"),ArgumentMatchers.any(Map.class)))

                .thenReturn(new ResponseEntity <Map>(someMap, HttpStatus.OK));

    }



}


class Service {


    private RestTemplate template;


    @Autowired

    public Service(RestTemplate template) {

        this.template = template;

    }


    public Map doSomething () {

        // do something with template

    }

}


查看完整回答
反對 回復 2023-03-09
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

我嘲笑這樣的休息模板


@RunWith(SpringRunner.class)

public class Clazz {


    @Mock

    private RestTemplate restTemplate;

}

所以嘗試使用 SpringRunner 而不是 MockitoRunner 也許它會起作用


查看完整回答
反對 回復 2023-03-09
?
哆啦的時光機

TA貢獻1779條經驗 獲得超6個贊

您確定要特別模擬 restTemplate 嗎?

不模擬 restTemplate 而是模擬答案怎么樣?

它還可以幫助您測試 restTemplate 行為。如果 restTemplate 得到 404 或 500 怎么辦?

這就是為什么我建議你使用MockRestServiceServer

它有助于檢查所有真實場景。


查看完整回答
反對 回復 2023-03-09
?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

你必須注入RestTemplate你的服務SomeService。目前,您正在服務中創建一個新實例。這意味著,您沒有獲得 的模擬實例RestTemplate,但獲得了真實類的全新實例RestTemplate。


你必須做這樣的事情:


class SomeService

{

   @Inject

   private RestTemplate restTemplate;   


   //some private, static,  final data members

   public Map getService(String sNo, String uId, String en)

   {

      ResponseEntity <Map> response = restTEmplate.getForEntity("https://someurl.com/someService", 

      Map.class);

      ...

   }

}


查看完整回答
反對 回復 2023-03-09
?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

如果您有權更改 SomeService 類,我建議您執行以下操作。


class SomeService

{

   //some private, static,  final data members

   public Map getService(String sNo, String uId, String en)

   {

      ResponseEntity <Map> response = getForEntity("https://someurl.com/someService", Map.class);

      Map body = response.getBody();

      //do something


      HttpEntity<?> request = new HttpEntity <>(payLoad, headers);

      //payload is Hash Map and headers is a LinkedMultiValueMap

      ResponseEntity <Map> response = postForEntity(url, request, headers);

      return response.getBody(); 

   }   

}

正如您可能已經猜到的getForEntity那樣,postForEntity方法已經被提取出來,RestTemplate 在其中被實例化——秘密地完成它的工作。既然你想從一開始就模擬 RestTemplate,我們擺脫它是一件好事——現在我們可以在沒有任何對象模擬的情況下監視我們的服務。


    @RunWith(MockitoJunitRunner.class)

    class TestSomeService

    {

       @InjectMocks

       @Spy

       SomeService ser;

       /*Some data members*/


       @Before

       {

          HttpEntity <?> request = new HttpEntity<>(reqPayload, headers);


          doReturn(new ResponseEntity <Map>(someMap, HttpStatus.OK))

            .when(ser).getForEntity("theUrl", Map.class));


          doReturn(new ResponseEntity <Map>(expectedMap, HttpStatus.OK))

            .when(ser).postForEntity("anotherUrl", request, Map.class));

       }


       @Test

       public void testGetService()

       {

           Map <String, Object> result = ser.getService("123", "abc", "QA");

       }    

    }


查看完整回答
反對 回復 2023-03-09
  • 5 回答
  • 0 關注
  • 286 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號