Spring boot Mokito 關鍵點簡單理解

[toc]
主要3個註解 + 簡單使用spring

註解

  • @MockBean 單獨使用, SpringBoot 在測試時, 會用這個註解的bean替換掉 SpringBoot 管理的原生bean. 通常測試時這一個註解足以.
  • @Mock 表示這是一個 mock 對象. 使用@InjectMocks 能夠注入到對應bean.(通常和@InjectMocks一塊兒使用)
  • @InjectMocks 表示這個對象會注入 mock 對象. 注入的就是剛纔被 @Mock 標註的對象.

@Mock@InjectMocks 一個用來標記, 一個用來注入. 須要在測試類前面添加 @RunWith(MockitoJUnitRunner.class) 註解, MockitoJUnitRunner.class會保證在執行測試之前, @Mock@InjectMocks 的初始化工做. 聽說這種方式不用啓動整個 SpringContext, 可是如今 SpringBootTest 測試也是能夠指定初始化哪些類, 測試也很方便.springboot

注意: @MockBean 修飾的對象默認行爲是什麼都不作. 因此要用 when(xxx).thenReturn(responsexx) 來明確 Mock 對象方法要返回什麼.spring-boot

示例

@MockBean

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { Xxx.class, X.class}) // 普通Spring方式測試
public class Test{

    @MockBean
    private DataService dataService; // 定義Mock類, 在test環境下, 會被Spring管理

    @Autowired
    private Xxx xxx;

    @Test
    public void test() throws Exception {
        Response mockResponse = structMockResponse();
        when(dataService.findByCondition(Matchers.any(Condition.class), Matchers.anyMap()))
                .thenReturn(mockResponse); // 定義Mock類行爲

        
        xxx.service(); // 並無直接調用 dataService 相關聯的類. @MockBean 在測試環境下, 替換掉 Spring 管理的類. `@Autowired` 注入類型和 `@MockBean` 標記類相同時, 會注入Mock 類.
        // Assert ignored ..
    }

    public void structMockResponse(){
        // ...
        return null;
    }
}

@Mock & @InjectMocks

@RunWith(MockitoJUnitRunner.class) // 須要使用MockitoJUnitRunner啓動測試
public class BusinessServicesMockTest {

	@Mock
	DataService dataServiceMock; // 標示Mock類

	@InjectMocks
	BusinessService businessImpl; // 注入Mock類

	@Test
	public void testFindTheGreatestFromAllData() {
		when(dataServiceMock.retrieveAllData()).thenReturn(new int[] { 24, 15, 3 }); // 定義Mock類行爲
		assertEquals(24, businessImpl.findTheGreatestFromAllData());
	}

	@Test
	public void testFindTheGreatestFromAllData_ForOneValue() {
		when(dataServiceMock.retrieveAllData()).thenReturn(new int[] { 15 });
		assertEquals(15, businessImpl.findTheGreatestFromAllData());
	}

	@Test
	public void testFindTheGreatestFromAllData_NoValues() {
		when(dataServiceMock.retrieveAllData()).thenReturn(new int[] {});
		assertEquals(Integer.MIN_VALUE, businessImpl.findTheGreatestFromAllData());
	}
}

參考

Spring Boot - Unit Testing and Mocking with Mockito and JUnit測試

相關文章
相關標籤/搜索