Mockito

如果所有的 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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章