Springboot單元測試 - 依賴類mock測試
通常單元測試中,我們會隔離依賴對于測試類的影響,也就是假設所有依賴的一定會輸出理想結果,在測試中可以通過Mock方法來確保輸出結果,這也就引入另一個測試框架Mockito。
Mockito框架的作用就是模擬接口功能,并不運行模擬接口的實際邏輯,而是直接輸出一個假定結果。
Mockito常見注釋及方法
@Mock | 被注釋的對象會作為Mock對象 |
@InjectMocks | 被注釋的對象依賴于@Mock的對象,通常是測試對象 |
when(<MockObject>.<method>).thenReturn() | 對@Mock的對象進行模擬輸出 |
doThrow(<Exception>).when(<mockObject>).<Method> | 對Mock的對象模擬拋出一個異常 |
spy() | 也是建立一個模擬對象,但可以 |
待測試類 - AController
public class AController {
@Autowired
MongoService mongoService;
public boolean testBean() {
boolean res = mongoService.testMethod2(4);
return res;
}
}
依賴類 - MongoService
@Service
public class MongoService {
public void output() {
System.out.println("This is a bean!!");
}
public boolean testMethod1(int num) {
return num > 0;
}
public boolean testMethod2(int num) {
int val = getVal();
return val > num;
}
private int getVal() {
return 2;
}
}
Mockito測試類 - RunWith需要運行MockitoJUnitRunner.class才能使用Mockito相關注解
方法1: 使用@Mock,更為簡潔只需加入注解就可以mock對應成員變量 (該成員變量可以是非依賴注入)
@RunWith(MockitoJUnitRunner.class)
public class MockTest {
@Mock
MongoService mongoService;
@InjectMocks
AController aController;
@Test
public void testMock1() {
when(mongoService.testMethod2(Mockito.anyInt())).thenReturn(true);
Assert.assertEquals(aController.testBean(), true);
}
@Test(expected = Exception.class)
public void testMock2() {
doThrow(Exception.class).when(mongoService).testMethod2(Mockito.anyInt());
aController.testBean();
}
}
方法2: 使用Mock函數(shù)
public class MockTest {
MongoService mongoService;
AController aController;
@BeforeEach
public void init() {
mongoService = Mock(MongoService.class);
aController = new AController();
/* 假設 AController class 中有setter用于加載mongoService */
aController.setMongoService(mongoService);
}
@Test
public void testMock1() {
when(mongoService.testMethod2(Mockito.anyInt())).thenReturn(true);
Assert.assertEquals(aController.testBean(), true);
}
@Test(expected = Exception.class)
public void testMock2() {
doThrow(Exception.class).when(mongoService).testMethod2(Mockito.anyInt());
aController.testBean();
}
}
?
@Mock 和 @Spy區(qū)別
上面兩種注釋都是建立一個模擬對象,但是區(qū)別是@Mock注釋的對象是完全虛擬,不能調用這個Mock對象的任何方法,只能通過when().thenReturn() 來進行模擬輸出;但是@Spy是建立一個真實的Mock對象,可以調用對象中任何方法也可以模擬某些方法的輸出。@Spy大大增加了測試的自由度,比如如果某個測試類你只想模擬某個方法但是想要某些方法的真實輸出,這是@Spy就可以解決這個問題。文章來源:http://www.zghlxwxcb.cn/news/detail-536303.html
舉例 - 模擬MongoService其中一個方法,并測試另一個方法真實輸出文章來源地址http://www.zghlxwxcb.cn/news/detail-536303.html
@Spy
MongoService mongoServiceSpy;
@Test
public void testSpy() {
/** 模擬MongoService中 getVal并測試testMethod2*/
when(mongoServiceSpy.getVal()).thenReturn(3);
Assert.assertEquals(mongoServiceSpy.testMethod2(2), true);
}
Reference
- SpringBoot Test及注解詳解 - codedot - 博客園
- 單元測試之Mockito與PowerMock - 簡書
到了這里,關于[Springboot 單元測試筆記] - Mock 和 spy的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!