如果所有的 Mock 对象全部通过手工来创建,那就不容易体现出 Mockito 的优越性出来。
因此对于被测试对象的创建,Mock 属性的注入应该让 @Mock 和 @InjectMocks这两个注解大显身手了。
@Mock:创建一个Mock。
@InjectMocks:创建一个实例,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。
@Autowird 等方式完成自动注入。在单元测试中,没有启动 spring 框架,此时就需要通过 @ InjectMocks完成依赖注入。
@InjectMocks会将带有 @Spy 和@Mock 注解的对象尝试注入到被 测试的目标类中。
记住下面这两句话即可:
Usually when you are unit testing, you shouldn’t initialize Spring context. So remove Autowiring.
Usually when you do integration testing, you should use real dependencies. So remove mocking.
@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
@Mock
private MyRepository myRepository;
@InjectMocks
private MyService myService;
@Test
public void testInjectMocks() {
System.out.println(myService.getMyRepository().getClass());
}
}
MyService 被标记了 @InjectMocks,在 setUp方法中 执行 MockitoAnnotations.initMocks(this); 的时候,会将标记了 @Mock 或 @Spy 的属性注入到 service 中。MyService 里面的 MyRepository 完全被Mock实例替换,所有的调用都是针对Mock生成类的。