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

Spring Boot JUnit4 如何测试void方法中Autowired注入字段的方法是否被调用

JUnit4 验证私有方法调用时依赖方法执行的方案

你可以使用Mockito框架完成测试,无需启动Spring上下文,哪怕Repository是外部依赖导入也可以正常mock验证,实现步骤如下:

1. 引入依赖(已引入可跳过)

如果是Maven项目,在pom.xml中添加Mockito依赖:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>4.11.0</version> <!-- 适配JUnit4的版本即可 -->
    <scope>test</scope>
</dependency>

2. 编写测试类代码

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.lang.reflect.Method;
import static org.mockito.Mockito.verify;

@RunWith(MockitoJUnitRunner.class)
public class ObjectServiceImplTest {

    // Mock掉外部依赖的Repository,无需真实实现
    @Mock
    private ObjectRepository objRepo;

    // 将Mock的Repository自动注入到待测试的Service实例中
    @InjectMocks
    private ObjectServiceImpl objectService;

    @Test
    public void testPublishObject_ShouldCallRepoSave() throws Exception {
        // 1. 构造测试参数
        Object testObj = new Object();

        // 2. 反射调用私有方法publishObject
        Method publishMethod = ObjectServiceImpl.class.getDeclaredMethod("publishObject", Object.class);
        publishMethod.setAccessible(true);
        publishMethod.invoke(objectService, testObj);

        // 3. 验证Repository的save方法被调用,且参数为传入的测试对象
        verify(objRepo).save(testObj);
        // 如果要指定调用次数,可以写成 verify(objRepo, times(1)).save(testObj)
    }
}

关键说明

  • 你不需要启动Spring上下文完成依赖注入,Mockito会自动处理@Mock和@InjectMocks注解的字段赋值
  • 如果后续你将publishObject方法的访问权限改为public,测试代码可以直接调用方法,省略反射部分的代码
  • 如果要验证save方法没有被调用,可以使用verify(objRepo, never()).save(any())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:48:02