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

如何spy测试类的指定方法以完成目标业务方法的单元测试

实现方案

你可以通过Mockito或者PowerMock工具Spy被测类,Mock私有方法的返回值来实现需求,以下是两种常用场景的实现代码:

方案1:Mockito 3.4+版本实现(推荐)

Mockito从3.4版本开始原生支持Mock私有方法,无需引入额外依赖,适配SpringBoot测试场景:

import org.mockito.ArgumentMatchers;
import org.mockito.Mockito;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class TestClassTest {
    // 注入TestClass的Spy代理对象,保留原类逻辑的同时支持方法Mock
    @SpyBean
    private TestClass testClass;

    @Test
    public void testTestingMethod() throws Exception {
        // 配置私有方法isTimeToExecute任意入参都返回true
        Mockito.doReturn(true)
               .when(testClass, "isTimeToExecute", ArgumentMatchers.anyString());
        
        // 执行被测方法,此时if分支会正常触发
        testClass.testingMethod();
        
        // 此处补充你的业务断言逻辑,验证if分支内代码执行结果
    }
}

方案2:旧版Mockito + PowerMock实现

如果你的项目使用3.4以下版本的Mockito,可以搭配PowerMock实现私有方法Mock:

  1. 首先引入PowerMock相关依赖(Maven示例):
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>2.0.9</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>2.0.9</version>
    <scope>test</scope>
</dependency>
  1. 测试代码示例:
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.junit.Test;
import org.junit.runner.RunWith;
import javax.inject.Inject;
import org.mockito.Spy;
import static org.mockito.ArgumentMatchers.anyString;

@RunWith(PowerMockRunner.class)
@PrepareForTest(TestClass.class)
public class TestClassTest {
    @Spy
    @Inject
    private TestClass testClass;

    @Test
    public void testTestingMethod() throws Exception {
        // 固定私有方法isTimeToExecute返回true
        PowerMockito.doReturn(true).when(testClass, "isTimeToExecute", anyString());
        
        testClass.testingMethod();
        
        // 补充业务断言逻辑
    }
}

注意事项

  • 如果仅需要匹配task1入参时返回true,把上述代码中的anyString()替换为"task1"即可。
  • 单元测试中尽量避免频繁Mock私有方法,更优的实现是将时间判断这类依赖外部环境的逻辑抽取为独立的公共组件,更方便Mock和维护。

内容的提问来源于stack exchange,提问作者kandarp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 00:06:10