@spy注解過(guò)的類,在沒(méi)有設(shè)置模擬的返回值的時(shí)候,所有的方法都是真實(shí)方法,返回和真實(shí)方法的返回是一樣的;而@Mock注解過(guò)的類,其所有的方法都是模擬的方法,如果沒(méi)有設(shè)置模擬的返回值,就會(huì)返回null。 另外,@spy注解過(guò)的類進(jìn)行方法的模擬時(shí)。一般使用下面這種格式:
Mockito.doReturn(yourResponse).when(yourService).yourMethod(yourRequest);@Mock注解的類一般都是使用下面這種格式:
Mockito.when(yourService.yourMethod(yourRequest)).thenReturn(yourResponse);一般我們都不會(huì)直接對(duì)Mock的類進(jìn)行測(cè)試,因?yàn)槟菢拥臏y(cè)試結(jié)果都是設(shè)定的。我們會(huì)對(duì)調(diào)用外部服務(wù)的類進(jìn)行mock,并對(duì)接受這個(gè)類的返回并進(jìn)行處理的類進(jìn)行單元測(cè)試。這時(shí)就需要@InjectMocks這個(gè)注解了。 比如說(shuō)類MyService.java是調(diào)用外部服務(wù)的類,MyCalc.java是接收外部服務(wù)的返回并進(jìn)行處理的類。實(shí)現(xiàn)代碼如下:
public class MyService{ public int sendRequest(String req){ int rsp = 0; //調(diào)用外部服務(wù)并收到返回結(jié)果 return rsp; }}public class MyCalc{ @Autowired PRivate MyService myService; public int calc(String s1 , String s2){ int a = myService.sendRequest(s1); int b = myService.sendRequest(s2); return a+b; }}如果測(cè)試類這樣寫:
public class MyTest{ @Spy private MyService myService; @Test public void testAAddB(){ Mockito.doReturn(3).when(myService).sendRequest("1"); MyCalc myCalc = new MyCalc(); System.out.println(myCalc.calc("1","2")); }}在運(yùn)行的時(shí)候會(huì)報(bào)空指針的錯(cuò)誤。因?yàn)镸yService這個(gè)類沒(méi)有初始化。 所以需要對(duì)類MyCalc進(jìn)行InjectMocks的注解。 改為以下的輸出就是正常的5了。
public class MyTest{ @Spy private MyService myService; @InjectMocks private MyCalc myCalc; @Test public void testAAddB(){ Mockito.doReturn(3).when(myService).sendRequest("1"); System.out.println(myCalc.calc("1","2")); }}新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注