Jmockit使用笔记_基本功能使用@Tested_@Injectable_@Mocked_Expectations
Jmockit使用筆記
測試框架Jmockit集合junit使用
@RunWith(JMockit.class)
寫在測試案例類上的注解
@Tested
在測試案例中,寫在我們要測試的類上面, 一般用實現(xiàn)類
@Injectable
在測試案例中聲明那些我們要測試的類中通過@Autowired注入的類
代碼展示如下:
/*** @author: xinruoxiangyang9010* 我們要測試的業(yè)務代碼*/ @Service public class MyServicempl implements MyService {@Autowiredprivate MyMapper myMapper;@Overridepublic String testMethod() {return "myService";} } /*** @author: xinruoxiangyang9010* 測試案例*/ @RunWith(JMockit.class) public class MyServicemplTest {@Injectableprivate MyMapper myMapper;@Testedprivate MyServicempl myServicempl;@Testpublic void testMethod() {String result = myServicempl.testMethod();assertEquals("myService", result);} }如果測試類中忘了用@Injectable修飾被測試代碼中所有的注入對象時, 哪怕遺漏了一個, 就會有如下報錯信息:
java.lang.IllegalStateException: Missing @Injectable for field "xxx.xxx.xxx.MyMapper myMapper" in MyServicempl@Mocked
與@Injectable類似都是在mock對象(這里的mock是指模擬的意思), 但又有區(qū)別, @Injectable只會影響被修改的那一個對象, 但是@Mocked 會影響所他所修飾的對象及其子類, 哪怕這個對象時你new出來的; 調(diào)用mock對象的方法時不會調(diào)用原代碼, 會交給JMockit處理, 均返回默認值(int,short,double等返回0,String返回null)
@Mocked private User user;Expectations
字面解釋預期,就是指定方法在調(diào)用時,返回我們想要的結果(當然有時候結果要我們自己提前準備好)
指定代碼中使用的工具類返回我們想要的值
/*** @author: xinruoxiangyang9010* 業(yè)務代碼*/ public class MyStringUtil {public static String getUUID() {return "id_1";}public static String getUUID2() {return "id_2";} } /*** @author: xinruoxiangyang9010* 測試案例*/ @RunWith(JMockit.class) public class MyStringUtilTest {@Testpublic void getUUID() {new Expectations(MyStringUtil.class) {{MyStringUtil.getUUID();result = "123";}};String resultString = MyStringUtil.getUUID();assertEquals("123", resultString);} }注意:
第一點 new Expectations(MyStringUtil.class) 這里要把MyStringUtil.class作為參數(shù)傳進去
第二點 如果Expectations中寫的方法, 實際卻沒有被調(diào)用,則測試案例會出現(xiàn)如下錯誤
@Test public void getUUID_test2() {new Expectations(MyStringUtil.class) {{MyStringUtil.getUUID();result = "123";MyStringUtil.getUUID2();result = "222";}};String resultString = MyStringUtil.getUUID();assertEquals("123", resultString); } Missing 1 invocation to: xin.ruo.xiang.yang.jmockit.MyStringUtil#getUUID2() Caused by: Missing invocationsat xin.ruo.xiang.yang.jmockit.MyStringUtil.getUUID2(MyStringUtil.java)at xin.ruo.xiang.yang.jmockit.MyStringUtilTest$2.<init>(MyStringUtilTest.java:35)at xin.ruo.xiang.yang.jmockit.MyStringUtilTest.getUUID_test2(MyStringUtilTest.java:31)在Expectations中指定某個方法被調(diào)用多次,返回不同結果
@Testpublic void getUUID_test3() {new Expectations(MyStringUtil.class) {{MyStringUtil.getUUID();result = "111";result = "222";result = "333";}};String resultString = MyStringUtil.getUUID();assertEquals("111", resultString);String resultString2 = MyStringUtil.getUUID();assertEquals("222", resultString2);String resultString3 = MyStringUtil.getUUID();assertEquals("333", resultString3);}這里結合Expectations的使用對@Mocked與@Injectable的不同再進行一下解釋
/*** @author: xinruoxiangyang9010* 業(yè)務代碼*/ public class DiffServiceImpl implements DiffService {public String method() {return "real";} } /*** @author: xinruoxiangyang9010* 測試案例*/ @RunWith(JMockit.class) public class MockAndInjectTest {@Testpublic void testMock(@Mocked DiffServiceImpl diffService) {new Expectations() {{diffService.method();result = "mockMethod";}};assertEquals("mockMethod", diffService.method());// @Mocked修飾的變量,即便是再new出來的,也會按照上面我們mock的結果返回assertEquals("mockMethod", new DiffServiceImpl().method());}@Testpublic void testInjectable (@Injectable DiffServiceImpl diffService) {new Expectations() {{diffService.method();result = "mockMethod";}};assertEquals("mockMethod", diffService.method());// 注意這里結果的不同, 在對@Injectable修飾的對象進行Expectations指定結果時// 受影響的只是被修飾的對象,如果我們new一個示例出來,是不會受Expectations影響的assertEquals("real", new DiffServiceImpl().method());} }總結
以上是生活随笔為你收集整理的Jmockit使用笔记_基本功能使用@Tested_@Injectable_@Mocked_Expectations的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样把jpg格式转换成pdf
- 下一篇: GNN理论入门和小实践——从卷积讲起