精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android單元測試 - 幾個重要問題

移動開發 Android
上一篇文章《Android單元測試 - 如何開始?》介紹了幾款單元測試框架、Junit & Mockito基本用法、依賴隔離 & Mock概念,本篇主要解答單元測試中幾個重要問題。

[[173976]]

原文鏈接:http://www.jianshu.com/p/f5d197a4d83a

前言

已經一個月沒寫文章了,由于9月份在plan國慶旅行計劃,國慶前前后后去了14天旅行,所以沒時間寫,哈哈。

言歸正傳,上一篇文章《Android單元測試 - 如何開始?》介紹了幾款單元測試框架、Junit & Mockito基本用法、依賴隔離 & Mock概念,本篇主要解答單元測試中幾個重要問題。

在單元測試交流微信群,很多新進來的小伙伴,都會幾個大同小異的問題。我們幾個老鳥們答完一次又一次(厚顏無恥地把自己算上^_^),筆者是有點不耐煩了,后來就等其他同學回答他們.....其實大家提的問題,歸根到底就是“依賴問題”,jvm依賴還是android依賴?用到native方法報錯怎么辦?靜態方法怎么解決?

于是呢,筆者決定專門寫一篇文章,來講解這幾個問題。

  • 如何解決Android依賴?
  • 隔離Native方法
  • 解決內部new對象
  • 靜態方法
  • RxJava異步轉同步

1.如何解決Android依賴?

小白:“Presenter中用到TextUtils,運行junit時報'java.lang.RuntimeException: Method isEmpty in android.text.TextUtils not mocked'錯誤... 是不是要用robolectric?”

別急,還未到robolectric出場的時候呢!

由于junit運行在jvm上,而jdk沒有android源碼,所以TextUtils這些在android sdk中的類,運行junit時就引用不上了。既然jdk沒有,我們就自己加唄!

在test/java目錄下,創建android.text.TextUtils類

  1. package android.text; 
  2.  
  3. public class TextUtils { 
  4.  
  5.     public static boolean isEmpty(CharSequence str) { 
  6.         if (str == null || str.equals("")) { 
  7.             return true
  8.         } 
  9.         return false
  10.     } 

關鍵是要個TextUtils同包名、同類名、同方法名。注意不是在main/java下創建,不然會提示Duplicate class found in the file...。單元測試運行妥妥的:

 

原理很簡單,jvm運行時會找android.text.TextUtils類,然后找isEmpty方法執行。學過java反射的同學都知道,只要知道包名類名,就可以拿到Class,知道該類某方法名,就可以獲取Method并執行。jvm也是類似的機制,只要我們給一個包名類名與android sdk相同的類,寫上方法名&參數&返回值相同的方法,jvm就能編譯并執行。

(提示:android的View之類也能這么搞噢)

2.隔離Native方法

小白:“我用到native方法,junit運行失敗,robolectric也不支持加載so文件,怎么辦?”

Model類:

  1. package com.test.unit; 
  2.  
  3. public class Model { 
  4.     public native boolean nativeMethod(); 
  5.  

單元測試:

  1. public class ModelTest { 
  2.  
  3.     Model model; 
  4.  
  5.     @Before 
  6.     public void setUp() throws Exception { 
  7.         model = new Model(); 
  8.     } 
  9.  
  10.     @Test 
  11.     public void testNativeMethod() throws Exception { 
  12.         Assert.assertTrue(model.nativeMethod()); 
  13.     } 
  14.  

run ModelTest... 報錯java.lang.UnsatisfiedLinkError: com.test.unit.Model.nativeMethod()

 

上篇文章《Android單元測試 - 如何開始?》講述的“依賴隔離”,這里要用到了!

改進單元測試:

  1. public class ModelTest { 
  2.  
  3.     Model model; 
  4.  
  5.     @Before 
  6.     public void setUp() throws Exception { 
  7.         model = mock(Model.class); 
  8.     } 
  9.  
  10.     @Test 
  11.     public void testNativeMethod() throws Exception { 
  12.         when(model.nativeMethod()).thenReturn(true); 
  13.  
  14.         Assert.assertTrue(model.nativeMethod()); 
  15.     } 

 再run一下,pass了:

 

這里稍微講講java查找native方法的過程:

1).Model.java全名是com.test.unit.Model.java;

2).調用native方法nativeMethod()后, jvm會去找C++層com_test_unit_Model.cpp,再找com_test_unit_Model_nativeMethod()方法,并調用。

在APP運行過程,我們會把cpp編譯成so文件,然后讓APP加載到dalvik虛擬機。但在單元測試中,沒有加載對應的so文件,也沒有編譯cpp呀!大牛們可能會嘗試單元測試時加載so文件,但完全沒有必要,也不符合單元測試的原則。

所以,我們可以直接用Mockito框架mock native方法就行啦。實際上,不僅僅是native方法需要mock,很多依賴的方法、類都要mock,下面會講到更常用的場景。

(參考《Android JNI原理分析》)

3.解決內部new對象

小白:“我在Presenter里new Model,Model依賴比較多,會做sql操作,等等.....Presenter依賴Model返回結果,導致Presenter沒法單元測試啦!求大神指點!”

小白C的例子:Model:

  1. public class Model { 
  2.     public boolean getBoolean() { 
  3.         boolean bo = ....... // 一堆依賴,代碼很復雜 
  4.         return bo; 
  5.     } 
  6.  

Presenter:

  1. public class Presenter { 
  2.  
  3.     Model model; 
  4.  
  5.     public Presenter() { 
  6.         model = new Model(); 
  7.     } 
  8.  
  9.     public boolean getBoolean() { 
  10.         return model.getBoolean()); 
  11.     } 
  12.  

錯誤的單元測試:

  1. public class PresenterTest { 
  2.  
  3.     Presenter presenter; 
  4.  
  5.     @Before 
  6.     public void setUp() throws Exception { 
  7.         presenter = new Presenter(); 
  8.     } 
  9.  
  10.     @Test 
  11.     public void testGetBoolean() throws Exception { 
  12.         Assert.assertTrue(presenter.getBoolean()); 
  13.     } 
  14.  

還是那句話:依賴隔離。我們隔離Model依賴,即mock Model對象,而不是new Model()。

找找以上PresenterTest的問題吧:PresenterTest完全不知道Model的存在,意思是無法mock Model。那么,我們就想辦法把mock Model傳給Presenter——在Presenter構造函數傳參!

改進Presenter:

  1. public class Presenter { 
  2.  
  3.     Model model; 
  4.  
  5.     public Presenter(Model model) { 
  6.         this.model = model; 
  7.     } 
  8.  
  9.     public boolean getBoolean() { 
  10.         return model.getBoolean(); 
  11.     } 
  12.  

正確的單元測試:

  1. public class PresenterTest { 
  2.     Model     model; 
  3.     Presenter presenter; 
  4.  
  5.     @Before 
  6.     public void setUp() throws Exception { 
  7.         model = mock(Model.class);// mock Model對象 
  8.  
  9.         presenter = new Presenter(model); 
  10.     } 
  11.  
  12.     @Test 
  13.     public void testGetBoolean() throws Exception { 
  14.         when(model.getBoolean()).thenReturn(true); 
  15.  
  16.         Assert.assertTrue(presenter.getBoolean()); 
  17.     } 
  18.  

事情就這么解決了。如果你覺得在Activity直接用默認Presenter構造函數,在構造函數new Model()比較方便,那就保留默認構造函數唄。當然使用dagger2就不存在多個構造函數了,都是構造傳參。

4.靜態方法

小白:“大神,我在Presenter用到靜態方法....”筆者:“行了,知道你要說什么。”

Presenter:

  1. public class Presenter { 
  2.  
  3.     public String getSignParams(int uid, String name, String token) { 
  4.         return SignatureUtils.sign(uid, name, token); 
  5.     } 
  6.  

解決方法跟上面【解決內部new對象】大同小異,核心思想還是依賴隔離。

1).把sign(...)改成非靜態方法;

2).把SignatureUtils作為成員變量;

3).構造方法傳入SignatureUtils;

4).單元測試時,把mock SignatureUtils傳給Presenter。

改進后Presenter:

  1. public class Presenter { 
  2.     SignatureUtils mSignUtils; 
  3.  
  4.     public Presenter(SignatureUtils signatureUtils) { 
  5.         this.mSignUtils= signatureUtils; 
  6.     } 
  7.  
  8.     public String getSignParams(int uid, String name, String token) { 
  9.         return mSignUtils.sign(uid, name, token); 
  10.     } 
  11.  

5.RxJava異步轉同步

小白:“大神...”

筆者:“為師掐指一算,料汝會遇此劫難。”

小白:(傳說中從入門到出家?) 

  1. public class RxPresenter { 
  2.  
  3.     public void testRxJava(String msg) { 
  4.         Observable.just(msg) 
  5.                   .subscribeOn(Schedulers.io()) 
  6.                   .delay(1, TimeUnit.SECONDS) // 延時1秒 
  7. //                  .observeOn(AndroidSchedulers.mainThread()) 
  8.                   .subscribe(new Action1<String>() { 
  9.                       @Override 
  10.                       public void call(String msg) { 
  11.                           System.out.println(msg); 
  12.                       } 
  13.                   }); 
  14.     } 
  15.  

單元測試

  1. public class RxPresenterTest { 
  2.  
  3.     RxPresenter rxPresenter; 
  4.  
  5.     @Before 
  6.     public void setUp() throws Exception { 
  7.         rxPresenter = new RxPresenter(); 
  8.     } 
  9.  
  10.     @Test 
  11.     public void testTestRxJava() throws Exception { 
  12.         rxPresenter.testRxJava("test"); 
  13.     } 
  14.  

運行RxPresenterTest:

 

你會發現沒有輸出"test",為什么呢?

由于testRxJava里面,Obserable.subscribeOn(Schedulers.io())把線程切換到io線程,并且delay了1秒,而testTestRxJava()單元測試早已在當前線程跑完了。筆者試過,即使去掉delay(1, TimeUnit.SECONDS),還是不會輸出‘test’。

可以看到筆者把.observeOn(AndroidSchedulers.mainThread())注釋掉了,我們把那句代碼加上,再跑一下testTestRxJava(),會報java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked.:

 

這是由于jdk沒有android.os.Looper這個類及相關依賴。

解決以上兩個問題,我們只要把Schedulers.io()&AndroidSchedulers.mainThread()切換為Schedulers.immediate()就可以了。RxJava開發團隊已經為大家想好了,提供了RxJavaHooks和RxAndroidPlugins兩個hook操作的類。

新建RxTools:

  1. public class RxTools { 
  2.     public static void asyncToSync() { 
  3.         Func1<Scheduler, Scheduler> schedulerFunc = new Func1<Scheduler, Scheduler>() { 
  4.             @Override 
  5.             public Scheduler call(Scheduler scheduler) { 
  6.                 return Schedulers.immediate(); 
  7.             } 
  8.         }; 
  9.  
  10.         RxAndroidSchedulersHook rxAndroidSchedulersHook = new RxAndroidSchedulersHook() { 
  11.             @Override 
  12.             public Scheduler getMainThreadScheduler() { 
  13.                 return Schedulers.immediate(); 
  14.             } 
  15.         }; 
  16.  
  17.         RxJavaHooks.reset(); 
  18.         RxJavaHooks.setOnIOScheduler(schedulerFunc); 
  19.         RxJavaHooks.setOnComputationScheduler(schedulerFunc); 
  20.  
  21.         RxAndroidPlugins.getInstance().reset(); 
  22.         RxAndroidPlugins.getInstance().registerSchedulersHook(rxAndroidSchedulersHook); 
  23.     } 
  24.  

在RxPresenterTest.setUp()加一句RxTools.asyncToSync();:

  1. public class RxPresenterTest { 
  2.     RxPresenter rxPresenter; 
  3.  
  4.     @Before 
  5.     public void setUp() throws Exception { 
  6.         rxPresenter = new RxPresenter(); 
  7.  
  8.         RxTools.asyncToSync(); 
  9.     } 
  10.     ... 
  11.  

再跑一次testTestRxJava():

 

總算輸出"test",感謝上帝啊!(應該打賞下筆者吧^_^)

讀者有沒發現RxTools.asyncToSync()多加了一句RxJavaHooks.setOnComputationScheduler(schedulerFunc),意思將computation線程切換為immediate線程。筆者發現,僅僅添加RxJavaHooks.setOnIOScheduler(schedulerFunc),對于有delay的Obserable還是未通過,于是順手把computation線程也切換了,于是就可以了。

還有RxJavaHooks.reset()和RxAndroidPlugins.getInstance().reset(),筆者發現,當運行大量單元測試時,有些會失敗,但單獨運行失敗的單元測試,又通過了。百思不得其解后,添加了那兩句.....可以了!

(關于RxJavaHooks和RxAndroidPlugins的使用,在很久前的文章 《(MVP+RxJava+Retrofit)解耦+Mockito單元測試 經驗分享》已經提及過)

小結

筆者:“小白同學,現在你踩過的坑,填好未?”

小白:“方丈,啊不,大神,上面幾個問題是解決了,不過還有其他問題。”

筆者:“不挖坑,怎么填坑呢?以后再給你講講其他單元測試的玄機。”

小白:“......”

本文詳述了幾個單元測試重要問題的解決方法,讀者不難發現,筆者一直強調 依賴隔離、依賴隔離、依賴隔離,這個概念在單元測試中相當重要。還搞不懂這個概念的同學,看多幾次《Android單元測試 - 如何開始?》(又厚顏無恥地廣告),同時在實踐中不斷回顧這個理念。

只要解決好這幾個問題,Presenter單元測試就不難了。還有本文未提及的sqlite、SharedPreferences單元測試、在后面的文章會給讀者介紹下。

感謝讀者對筆者一直以來的支持,麻煩點贊&隨手轉發,好人一世平安。

關于作者

我是鍵盤男。在廣州生活,在創業公司上班,猥瑣文藝碼農。喜歡科學、歷史,玩玩投資,偶爾獨自旅行。希望成為獨當一面的工程師。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2012-10-29 09:45:52

單元測試軟件測試測試實踐

2016-11-23 16:18:22

物聯網產品問題

2022-10-31 13:31:15

云遷移云計算

2018-11-20 14:35:35

邊緣計算物聯網云計算

2010-02-07 15:42:46

Android單元測試

2017-01-14 23:42:49

單元測試框架軟件測試

2010-01-28 15:54:19

Android單元測試

2017-02-21 10:30:17

Android單元測試研究與實踐

2011-06-01 15:49:00

Android 測試

2019-01-31 08:00:50

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2020-08-18 08:10:02

單元測試Java

2017-03-23 16:02:10

Mock技術單元測試

2021-05-05 11:38:40

TestNGPowerMock單元測試

2020-05-07 17:30:49

開發iOS技術

2011-07-04 18:16:42

單元測試

2023-07-26 08:58:45

Golang單元測試

2011-05-16 16:52:09

單元測試徹底測試

2009-09-01 10:20:06

protected方法單元測試
點贊
收藏

51CTO技術棧公眾號

视频一区二区三| 欧美在线视频网站| 97中文字幕在线观看| 国产免费拔擦拔擦8x在线播放| 99国内精品久久| 国产精品日韩欧美大师| 精品无码免费视频| 国产伦精品一区二区三区千人斩| 欧美福利视频一区| 免费一级特黄特色毛片久久看| 国产中文在线视频| 国产69精品久久久久777| 欧洲亚洲妇女av| 国产成人久久久久| 极品美女一区二区三区| 日韩三级.com| 亚洲天堂2018av| 国产高清视频色在线www| 国产精品视频你懂的| 国产一区二区在线观看免费播放| 中文字幕在线网站| 夜久久久久久| 欧美俄罗斯乱妇| 18啪啪污污免费网站| 亚洲电影一级片| 精品久久久久久久久久久院品网| 一本岛在线视频| 综合久久2023| 欧美日韩久久久久| www插插插无码视频网站| 黄色免费在线看| 欧美激情一区三区| 久热这里只精品99re8久| 99久久精品国产色欲| 日本视频一区二区三区| 欧美自拍大量在线观看| 国产性70yerg老太| 中文字幕免费一区二区| xxxxx成人.com| 国产精品国产三级国产专业不 | 国产精品旅馆在线| 久久久国产精品成人免费| 韩国欧美一区| 欧美日本啪啪无遮挡网站| 992在线观看| 成人看的羞羞网站| 国产亚洲欧洲黄色| 国产在线观看h| 国产a久久精品一区二区三区| 日韩电影在线观看中文字幕 | 亚洲精品成人精品456| 亚洲国产一区二区三区在线播 | 日韩精品一区二区三区色欲av| a级片在线免费| 亚州成人在线电影| 国产人妻777人伦精品hd| 成人免费观看在线观看| 亚洲成人av电影在线| 日本手机在线视频| 小h片在线观看| 欧美视频在线视频| 中文字幕欧美人妻精品一区| 69堂免费精品视频在线播放| 欧美亚洲国产一卡| 国产wwwxx| 91精品一久久香蕉国产线看观看| 欧美另类z0zxhd电影| 亚洲天堂av一区二区| 99综合久久| 亚洲成人中文字幕| 中文字幕丰满孑伦无码专区| 欧美日韩国产高清电影| 日韩中文在线观看| 久久免费黄色网址| 男女精品网站| 国产原创欧美精品| 亚洲国产999| 91影院在线观看| 日韩久久久久久久| 毛片免费不卡| 性久久久久久久| 欧美综合在线观看视频| 日韩在线电影| 亚洲成色777777女色窝| 日韩欧美黄色网址| 亚洲欧美一级二级三级| 91av在线播放| 91激情在线观看| 不卡电影免费在线播放一区| 欧美少妇一区| av在线官网| 色综合一区二区| 五月天国产视频| 日本久久成人网| 中文字幕亚洲综合久久筱田步美 | 艳女tv在线观看国产一区| 久久久亚洲国产| 黄色污污视频软件| 国产99久久久国产精品潘金| 日韩精品久久一区二区三区| 性欧美高清come| 欧美色视频一区| 亚洲一区二区三区四区五区六区| 日韩精品首页| 97国产在线观看| 一级特黄色大片| 久久婷婷久久一区二区三区| 亚洲第一页在线视频| 欧美男人天堂| 日韩美女视频在线| 国产精品综合激情| 免费亚洲网站| 国产三区二区一区久久| 成人短视频在线| 91精品1区2区| 97人妻精品一区二区三区免| 综合在线一区| 国产精品一区二区三区免费视频 | 一级黄色在线观看| 成人一级片在线观看| 亚洲狠狠婷婷综合久久久| 黄色软件视频在线观看| 欧美一区二区高清| 男女男精品视频网站| 久久这里有精品15一区二区三区| 3d动漫啪啪精品一区二区免费| 国产乱理伦片a级在线观看| 污片在线观看一区二区| 能看毛片的网站| 91视频综合| 国产精品视频xxx| 黄色片免费在线| 精品成人在线视频| 李丽珍裸体午夜理伦片| 黑人一区二区三区四区五区| 91精品视频观看| 免费的黄网站在线观看| 精品视频在线免费| 永久免费av无码网站性色av| 性伦欧美刺激片在线观看| 国产一区二区免费在线观看| 超免费在线视频| 亚洲第一免费播放区| 久久久国产精华液| 国产iv一区二区三区| 亚洲激情免费视频| 日韩一区二区三区精品 | 久久久久久久蜜桃| 国产黑丝在线一区二区三区| 亚洲成人动漫在线| 欧洲一区在线| 久久久久女教师免费一区| 亚洲va久久久噜噜噜无码久久| 亚洲免费在线视频一区 二区| 手机在线国产视频| 欧美片第1页综合| 国产精品亚洲不卡a| а√在线中文在线新版| 日韩av网址在线观看| 中文字幕第四页| 久久久久高清精品| 美女一区二区三区视频| 欧美黄色大片在线观看| 亚洲aaa激情| 草莓视频丝瓜在线观看丝瓜18| 精品99久久久久久| 国产超碰人人爽人人做人人爱| 91丨porny丨蝌蚪视频| 欧美精品无码一区二区三区| 欧美国产偷国产精品三区| 91麻豆蜜桃| 自拍偷拍欧美视频| 日韩中文字幕视频在线| 亚洲av永久纯肉无码精品动漫| 精品久久久久久| 国产精品麻豆免费版现看视频| 国产一区二区三区久久悠悠色av| 日韩a级黄色片| 香蕉久久99| 国产自产女人91一区在线观看| 里番在线播放| 亚洲一区www| 日韩一级特黄毛片| 婷婷激情五月网| 久久久久9999亚洲精品| mm131国产精品| 亚洲免费黄色| 亚洲在线视频一区二区| 国产精品一区二区三区美女| 国产精品久久久久久久久久久久久| 日韩在线观看www| 日韩成人av在线| 一区二区的视频| 偷拍一区二区三区| 日韩av手机在线免费观看| 99久精品国产| 1314成人网| 美女精品在线| 国产一二三区在线播放| 成人高清av| 国产日韩精品推荐| 天堂综合在线播放| 日韩女在线观看| 欧美videossex| www欧美日韩| 高清性色生活片在线观看| 亚洲国产精品成人一区二区| 亚洲在线精品视频| 日韩欧美视频一区二区三区| 黄色一级片在线免费观看| 国产午夜三级一区二区三| 亚洲精品无码一区二区| 老司机免费视频一区二区| 日韩精品视频一区二区在线观看| 中国成人一区| 这里只有精品66| 国产探花一区在线观看| 精品免费国产| 99re6热只有精品免费观看| 国产精品永久免费观看| 外国成人直播| 77777少妇光屁股久久一区| 欧美另类tv| 久久久av一区| 欧美成人hd| 中文字幕亚洲自拍| 国产黄色在线| 亚洲新声在线观看| 美女毛片在线看| 日韩精品视频三区| 无码精品视频一区二区三区| 日韩精品一区二区三区视频在线观看 | 自拍偷拍一区二区三区四区| 老司机午夜精品视频在线观看| 国产一级爱c视频| 欧美涩涩网站| 欧美激情亚洲天堂| 欧美一区二区三区久久精品| 椎名由奈jux491在线播放 | 91精品国产自产精品男人的天堂 | 国产成人影院| 牛人盗摄一区二区三区视频| 亚洲精品亚洲人成在线观看| 国产欧美一区二区视频| 久久午夜影院| 久久综合久久久| 国产欧美日韩精品高清二区综合区| 蜜桃网站成人| 教室别恋欧美无删减版| 无遮挡亚洲一区| 久久日文中文字幕乱码| 一区视频二区视频| 欧美黄色一区| 欧日韩免费视频| 亚洲欧美不卡| 久热精品在线观看视频| 国产一区二三区好的| 久久久久亚洲av无码网站| 成人的网站免费观看| 日本黄色网址大全| 欧美激情一二三区| 国产suv精品一区二区68| 亚洲欧美日韩一区| 久久久久黄色片| 精品毛片三在线观看| 在线视频精品免费| 91精品在线一区二区| 亚洲av无码一区二区三区dv| 亚洲美女www午夜| 午夜不卡视频| 欧美激情第99页| 高清不卡av| 91在线观看免费观看| 国产精品流白浆在线观看| 欧洲精品久久| 一区二区蜜桃| 精品中文字幕av| 毛片av一区二区| 亚洲免费观看在线| 国产欧美精品一区二区色综合朱莉| 四虎884aa成人精品| 欧美日韩美女在线观看| 一区二区三区午夜| 亚洲激情视频在线播放| 日韩av中文| 51视频国产精品一区二区| 在线观看欧美| 欧美久久在线| 中出一区二区| 黄色三级视频片| 成人成人成人在线视频| 老司机深夜福利网站| 亚洲成a人片在线不卡一二三区| 亚洲黄网在线观看| 日韩欧美国产高清| 中文字幕在线播放| 38少妇精品导航| 日韩免费一级| 亚洲v欧美v另类v综合v日韩v| 国产综合激情| 三年中文在线观看免费大全中国| 99国产精品久| 麻豆一区二区三区精品视频| 欧美午夜一区二区三区| 婷婷av一区二区三区| 久久综合久中文字幕青草| 人人鲁人人莫人人爱精品| 国产亚洲二区| 欧美精品日本| 污污的视频免费观看| 日本一区二区三区国色天香| 日韩手机在线观看| 欧美不卡在线视频| 免费在线视频欧美| 国产极品精品在线观看| 日韩中文av| 日韩黄色短视频| 国产精品一级片| 肉色超薄丝袜脚交69xx图片| 日韩欧美国产网站| 亚洲色图欧美视频| 久久久久久亚洲精品不卡| 欧美激情三级| 黑人巨大国产9丨视频| 九九国产精品视频| 久久久久人妻一区精品色| 欧美午夜精品理论片a级按摩| 亚洲 另类 春色 国产| 国内成人精品视频| 成人在线视频中文字幕| 300部国产真实乱| 精品一区二区免费| 女同久久另类69精品国产| 欧美日韩在线播放三区| jizz亚洲| 国产欧美一区二区| 欧美岛国激情| 51自拍视频在线观看| 综合av第一页| 国产女人18毛片18精品| 欧美成人全部免费| 日韩一级淫片| av女优在线播放| 波多野洁衣一区| 欧美bbbbbbbbbbbb精品| 日韩电影在线观看中文字幕| 亚洲淫成人影院| 日韩免费三级| 久久国产婷婷国产香蕉| 一级性生活免费视频| 日韩欧美在线综合网| 国产羞羞视频在线播放| 精品日产一区2区三区黄免费| 在线亚洲免费| 日本精品在线观看视频| 欧美日韩久久久久久| 黄色网在线播放| 国产成人av一区二区三区| 99精品国产在热久久婷婷| 亚洲国产无码精品| 欧美三级在线视频| 污片视频在线免费观看| 国产一区二区三区高清视频| 午夜一级在线看亚洲| av永久免费观看| 欧美一区二区视频在线观看 | 欧美xxxxx视频| 天堂在线精品视频| 五月天欧美精品| 九色在线观看视频| 成人亚洲激情网| 日韩一级欧洲| 香蕉久久久久久久| 欧美不卡一二三| 亚洲女同av| 中文字幕人成一区| 成人涩涩免费视频| 蜜臀99久久精品久久久久小说| 日韩在线视频国产| 国产成人在线中文字幕| 韩国一区二区av| 亚洲免费观看高清在线观看| 天天操天天干天天干| 国产精品ⅴa在线观看h| 欧美午夜在线| 蜜桃久久精品成人无码av| 日韩丝袜美女视频| 欧美性理论片在线观看片免费| 看全色黄大色大片| 久久男人中文字幕资源站| 国产情侣av在线| 国产91亚洲精品| 欧美特黄一区| wwwww黄色| 日韩精品视频在线观看免费| 91精品一区| 国产a级片免费观看| 亚洲综合视频在线观看| jizz亚洲| 品久久久久久久久久96高清|