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
相关产品推荐
相关产品推荐

