有没有一种方法可以模拟本地对象上的方法调用

时间:2019-10-17 07:27:08

标签: java spring-boot junit mockito spring-boot-test

我正在使用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或更改代码。我应该如何进行?任何帮助都非常感谢。

2 个答案:

答案 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(...)