我正在使用Mockito框架为现有的spring-boot项目编写测试用例。
在其中一个类中,他们在函数内部而不是rest-template
中创建了@Autowiring
的本地实例。
public LatxDetails getLatxCaseDetail_Fallback(String endpoint, Map<String, String> requestMap) {
//some code
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.exchange(kxCreateEndpoint, HttpMethod.POST, httpEntity, String.class);
//some code
我无法模拟其余的调用。我无法添加任何其他外部jar或更改代码。我应该如何进行?任何帮助都非常感谢。
答案 0 :(得分:2)
显而易见的解决方案是注入RestTemplate
而不是在本地实例化,但是正如您所说的那样,您不能更改现有代码,我建议使用PowerMock with Mockito来替换{ RestTemplate
使用PowerMockito.whenNew
方法。
例如
RestTemplate restTemplateMock = Mockito.mock(RestTemplate.class);
PowerMockito.whenNew(RestTemplate.class).withAnyArguments().thenReturn(restTemplateMock);
,然后在restTemplateMock对象上进行when
设置。
如Strelok在评论中所述:要使用PowerMockito,您需要通过用PowerMockRunner
和@RunWith(PowerMockRunner.class)
注释测试类来使用@PrepareForTest
运行测试。
例如
@RunWith(PowerMockRunner.class)
@PrepareForTest(RestTemplate.class)
public class Test {
答案 1 :(得分:0)
用Mock替换RestTemplate或创建它的间谍:
// Mock
RestTemplate restTemplate = Mockito.mock(RestTemplate.class);
// Spy
RestTemplate restTemplate = new RestTemplate();
RestTemplate spy = Mockito.spy(restTemplate);
您可以像往常一样模拟exchange
方法:
// mock
doReturn(...).when(restTemplate).exchange(...)
// spy
doReturn(...).when(spy).exchange(...)