網(wǎng)站首頁(yè)優(yōu)化營(yíng)銷型網(wǎng)站外包
Jmockit使用筆記_基本功能使用@Tested_@Injectable_@Mocked_Expectations_jmockit.class-CSDN博客
靜態(tài)變量直接賦值就好,沒(méi)必要mock了?
測(cè)試框架Jmockit集合junit使用
@RunWith(JMockit.class)
寫在測(cè)試案例類上的注解
@Tested
在測(cè)試案例中,寫在我們要測(cè)試的類上面, 一般用實(shí)現(xiàn)類
@Injectable
在測(cè)試案例中聲明那些我們要測(cè)試的類中通過(guò)@Autowired注入的類
? ? ? ? ? ? ? ? ? ? ? ??
原文鏈接:https://blog.csdn.net/Java_XiaoBei/article/details/126150129
/*** @author: xinruoxiangyang9010* 測(cè)試案例*/
@RunWith(JMockit.class)
public class MyServicemplTest {@Injectableprivate MyMapper myMapper;@Testedprivate MyServicempl myServicempl;@Testpublic void testMethod() {String result = myServicempl.testMethod();assertEquals("myService", result);}
}
2. 必須加 @RunWith(JMockit.class)
的情況
- 使用 JUnit 4:
如果你的項(xiàng)目是基于 JUnit 4 的測(cè)試框架,而測(cè)試類中使用了 JMockit 提供的注解(如@Mocked
、@Injectable
)或 API(如Expectations
、Verifications
),則必須加上@RunWith(JMockit.class)
。
原因:
JUnit 4 默認(rèn)使用BlockJUnit4ClassRunner
運(yùn)行器,而 JMockit 的特性需要通過(guò)JMockitTestRunner
擴(kuò)展運(yùn)行器支持。如果不加@RunWith(JMockit.class)
,JMockit 的增強(qiáng)功能不會(huì)生效。
測(cè)試類中不使用 JMockit 特性:
如果你的測(cè)試沒(méi)有使用 JMockit 的 @Mocked
、@Injectable
、@Tested
或其他功能,只是普通的單元測(cè)試,則可以不加 @RunWith(JMockit.class)
。?
Expectations:返回他的result?
在 JMockit 的 Expectations
中,如果沒(méi)有為方法設(shè)置返回值(result
),或?qū)?result
設(shè)置為 null
,則會(huì)根據(jù)方法的簽名返回以下內(nèi)容:
1. 沒(méi)有指定 result
的情況
new Expectations(MyStringUtil.class) {{MyStringUtil.getUUID(); // 沒(méi)有設(shè)置 result
}};
String resultString = MyStringUtil.getUUID();
assertEquals(null, resultString); // 返回 null
- 如果沒(méi)有顯式設(shè)置
result
,默認(rèn)行為是方法返回類型的默認(rèn)值:- 基本類型(如
int
、double
):返回其默認(rèn)值(0
或0.0
)。 - 對(duì)象類型:返回
null
。 void
方法:不會(huì)有返回值。
- 基本類型(如
------------------
如果是void
方法不能設(shè)置result
值,因?yàn)樗环祷厝魏蝺?nèi)容。- 如果你嘗試為
void
方法設(shè)置result
,JMockit 會(huì)拋出異常。java.lang.IllegalArgumentException: Attempted to specify a result for a void method. - 對(duì)于
void
方法,你可以使用Verifications
來(lái)驗(yàn)證方法的調(diào)用行為。
@Test
public void voidMethodTest() {new Expectations() {{// 模擬任何期望,但不設(shè)置返回值MyStringUtil.doSomething();}};// 調(diào)用 void 方法MyStringUtil.doSomething();// 驗(yàn)證 void 方法是否被調(diào)用new Verifications() {{MyStringUtil.doSomething(); // 驗(yàn)證是否調(diào)用times = 1; // 驗(yàn)證調(diào)用次數(shù)}};
}
這段代碼就是檢查doSomething()是否調(diào)用了1次,times=2就是檢查是否用了兩次
下面這段代碼太好了:
結(jié)合Expectations的使用對(duì)@Mocked與@Injectable的不同
/*** @author: xinruoxiangyang9010* 測(cè)試案例*/
@RunWith(JMockit.class)
public class MockAndInjectTest {@Testpublic void testMock(@Mocked DiffServiceImpl diffService) {new Expectations() {{diffService.method();result = "mockMethod";}};assertEquals("mockMethod", diffService.method());// @Mocked修飾的變量,即便是再new出來(lái)的,也會(huì)按照上面我們mock的結(jié)果返回assertEquals("mockMethod", new DiffServiceImpl().method());}@Testpublic void testInjectable (@Injectable DiffServiceImpl diffService) {new Expectations() {{diffService.method();result = "mockMethod";}};assertEquals("mockMethod", diffService.method());// 注意這里結(jié)果的不同, 在對(duì)@Injectable修飾的對(duì)象進(jìn)行Expectations指定結(jié)果時(shí)// 受影響的只是被修飾的對(duì)象,如果我們new一個(gè)示例出來(lái),是不會(huì)受Expectations影響的assertEquals("real", new DiffServiceImpl().method());}
}
這里寫的也很好?
JMockit單元測(cè)試詳解-CSDN博客
基本流程
record(錄制)---- replay(回放) ---- verify(驗(yàn)證)
record : 設(shè)置將要被調(diào)用的方法和返回值。
- Expections中的方法至少被調(diào)用一次,否則會(huì)出現(xiàn)missing invocation錯(cuò)誤。調(diào)用次數(shù)和調(diào)用順序不限。
- StrictExpectations中方法調(diào)用的次數(shù)和順序都必須嚴(yán)格執(zhí)行。如果出現(xiàn)了在StrictExpectations中沒(méi)有聲明的方法,會(huì)出現(xiàn)unexpected invocation錯(cuò)誤。
replay:調(diào)用(未被)錄制的方法,被錄制的方法調(diào)用會(huì)被JMockit攔截并重定向到record階段設(shè)定的行為。
verify:基于行為的驗(yàn)證,測(cè)試CUT是否正確調(diào)用了依賴類,包括:調(diào)用了哪些方法;通過(guò)怎樣的參數(shù);調(diào)用了多少次;調(diào)用的相對(duì)順序(VerificationsInOrder)等??梢允褂胻imes,minTimes,maxTimes來(lái)驗(yàn)證。
?
RunWith(JMockit.class): 指定單元測(cè)試的執(zhí)行類為JMockit.class。
Tested: 指定被測(cè)試類,同時(shí)mock實(shí)例并注入測(cè)試類;依賴的類使用Injectable注入。
Injectable: 將對(duì)象進(jìn)行mock并注入測(cè)試類。
Mocked:mock一種類型,并注入測(cè)試類。
Mocked與Injectable區(qū)別:
- Mocked 注入的依賴,類的所有實(shí)例都被mock,record的方法,在replay時(shí),按照record的結(jié)果返回;沒(méi)有record的方法返回默認(rèn)值。
- Injectable 注入的依賴,只mock指定的實(shí)例,record的方法,在replay時(shí),按照record的結(jié)果返回;沒(méi)有record的方法返回默認(rèn)值。沒(méi)有mock的實(shí)例,調(diào)用其原始方法。
?