如何使用Mockito/PowerMock Mock父类protected方法返回模拟数据?
问题原因
- 你创建了
OfferService的spy代理对象,但实际调用get()方法时使用的仍是原始的offerService实例,Mock规则绑定在spy对象上,自然不会生效 - 测试类缺少PowerMock必填的
@PrepareForTest注解,Mock继承自父类的非public方法时,需要将当前测试的子类加入预处理列表 - setup方法中手动实例化
OfferService,覆盖了@InjectMocks的自动注入逻辑,导致@Mock声明的RestTemplate无法注入到测试实例中,后续restTemplate的Mock规则也会失效
修正后的测试代码
package com.pack; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import static org.mockito.Matchers.anyString; import static org.powermock.api.mockito.PowerMockito.doReturn; import static org.powermock.api.mockito.PowerMockito.spy; @RunWith(PowerMockRunner.class) @PrepareForTest(OfferService.class) public class OfferServiceTest { @InjectMocks OfferService offerService; @Mock RestTemplate restTemplate; @Mock HttpEntity<Object> entity; @Before public void setup() { MockitoAnnotations.initMocks(this); } @Test public void getTest() throws Exception { OfferResponses offerResponses = new OfferResponses(); ResponseEntity<OfferResponses> responseEntity = new ResponseEntity<>(offerResponses, HttpStatus.OK); PowerMockito.when( restTemplate.exchange(anyString(), Matchers.eq(HttpMethod.GET) , Matchers.anyObject(), Matchers.<Class<OfferResponses>>anyObject())) .thenReturn(responseEntity); OfferService spy = spy(offerService); doReturn(entity).when(spy, "getHttpEntity", Matchers.anyString()); // 调用spy对象的get方法触发Mock规则 Object result = spy.get(); // 后续断言逻辑 } }
内容的提问来源于stack exchange,提问作者Fllappy
相关产品推荐
相关产品推荐

