如何在Service中Mock@Autowired@Qualifier注解标注的属性?
当然可以给这个属性赋值!
你说的没错,单元测试里如果没加载Spring上下文(或者用了纯Mock框架),@Autowired的属性肯定是空的——因为Spring没机会帮你注入呀。不过要给这个test属性设指定值,有几种简单的办法,不用硬套Mockito的when语法(毕竟String是简单类型,Mock它反而没必要):
1. 纯Mockito单元测试(不启动Spring):直接反射赋值
这是最直接的方式,用Spring的ReflectionTestUtils工具类绕过私有属性的访问限制,直接设值:
import org.springframework.test.util.ReflectionTestUtils; import org.junit.jupiter.api.Test; class YourServiceTest { @Test void testYourServiceLogic() { // 创建Service实例 YourService service = new YourService(); // 给私有属性test赋值 ReflectionTestUtils.setField(service, "test", "a string"); // 接下来就可以调用service的方法,验证逻辑了 // 比如:assertEquals("expected result", service.someMethod()); } }
2. Spring上下文测试:用@Value覆盖配置
如果你的测试需要加载部分Spring上下文(比如用@SpringBootTest或@TestConfiguration),可以直接用@Value注解覆盖XML里的配置值:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.junit.jupiter.api.Test; @SpringBootTest class YourServiceSpringTest { @Autowired private YourService service; // 用@Value指定测试值,@Qualifier匹配Service里的属性限定符 @Value("a string") @Qualifier("test") private String test; @Test void testWithSpringContext() { // 此时service里的test属性已经被设为"a string"了 // 执行测试逻辑 } }
3. 混合场景:Mock其他依赖+赋值test属性
如果你的Service还有其他需要Mock的依赖(比如DAO、其他Service),可以结合Mockito的@InjectMocks和反射赋值:
import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.test.util.ReflectionTestUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(MockitoExtension.class) class YourServiceMixedTest { // 自动注入Mock对象到Service里 @InjectMocks private YourService service; // Mock其他依赖 @Mock private YourOtherDependency otherDependency; @BeforeEach void setUp() { // 给test属性赋值 ReflectionTestUtils.setField(service, "test", "a string"); } @Test void testWithMocks() { // 可以给otherDependency设置Mock行为 // when(otherDependency.someMethod()).thenReturn("mock result"); // 测试service的方法 } }
为什么你的when(test).thenReturn("a string")不行?
因为test是Service类里的私有属性,你在测试代码里根本拿不到它的引用;而且String是final类,Mockito默认不能Mock它(就算开启配置也没必要)。所以直接给属性赋值才是最适合这个场景的方案。
内容的提问来源于stack exchange,提问作者anubis
相关产品推荐
相关产品推荐

