You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:12:01