簡體   English   中英

如何通過Mockito模擬RestTemplate

[英]How to mock resttemplate by mockito

我想模擬一個resttemplate請求,但似乎不起作用。 這是我要測試的課程:

public class SomeUtil {
    public static OrderInstanceResponse doGet(String url, otherargs...) {
       //some code...
       ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.GET, requestHeader, String.class, requestMap);
       //another code...
    }
}

這是測試類:

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

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void doGet() {
        OrderInstanceResponse exceptResponse = OrderInstanceResponse.builder().code("123").build();
        OrderInstanceRequest request = OrderInstanceRequest.builder().userId("123").build();

        Map<String, Object> testMap = new HashMap<>(1);
        testMap.put("userId", "123");

        Mockito.when(restTemplate.exchange(Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.eq(String.class), Mockito.eq(testMap)))
                .thenReturn(new ResponseEntity<>("\"code\":\"123\"", HttpStatus.OK));

        OrderInstanceResponse actualResponse = RestTemplateUtil.doGet("123", request, "123");
        Assert.assertEquals(actualResponse.getCode(), exceptResponse.getCode());
    }
}

運行此測試時,會出現一些錯誤: java.lang.IllegalArgumentException: URI is not absolute

似乎模擬不起作用,真正的要求是“ 123”。

我該如何解決此錯誤?

您需要將RestTemplate實例作為依賴項傳遞給RestTemplate以使其起作用,而不是在doGet方法中實例化它。 然后,在單元測試中,將模擬的RestTemplate實例傳遞給RestTemplateUtil。

public class SomeUtil {
    public SomeUtil(RestTemplate restTemplate) { this.restTemplate = restTemplate }
    public OrderInstanceResponse doGet(String url, otherargs...) {
        ResponseEntity<String> responseEntity = this.restTemplate.exchange(...
    }
}

如果要將其保留為靜態方法,則可以將RestTemplate作為參數傳遞。

我找到了解決方案。 當我們需要模擬由new創建的對象時,例如RestTemplate rest = new RestTemplate() ,應這樣寫:

PowerMockito.whenNew(ObjectToBeMocked.class).withAnyArguments().thenReturn(mockedObject);

然后添加注釋@PrepareForTest({TheClassToBeTested.class}) 請注意,參數是包含由new獲得的對象的類。 因此,完整的代碼如下:

@RunWith(MockitoJUnitRunner.class)
@PrepareForTest({SomeUtil.class})
public class SomeUtilTest {

    @Mock
    private RestTemplate restTemplate;

    @Test
    public void doGet() {
        //......
        PowerMockito.whenNew(RestTemplate.class).withAnyArguments().thenReturn(restTemplate);
        //......
    }
}

感謝所有幫助我的朋友。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM