如果所有的 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生成類的。
作者:zoyoto
鏈接:https://www.jianshu.com/p/bb705a56f620
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。