[英]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.