精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

色大18成网站www在线观看| 1级黄色大片儿| 午夜不卡一区| 亚洲一区中文在线| 精品一区在线播放| 久久国产香蕉视频| 欧美激情日韩| 亚洲乱码av中文一区二区| 国产精品久久久毛片| www在线免费观看视频| 99国产精品一区| 国产精品一区二区三区毛片淫片 | 波多野结衣电车痴汉| 国产精品国产一区| 精品性高朝久久久久久久| 国产一伦一伦一伦| 九九色在线视频| 久久精品亚洲精品国产欧美| 亚洲xxx大片| 色老头在线视频| 黄色亚洲在线| 神马久久久久久| 四虎影成人精品a片| 久久久久亚洲精品中文字幕| 在线一区二区三区四区五区| 国产美女作爱全过程免费视频| 国产理论电影在线观看| 不卡一区二区中文字幕| 成人网在线视频| 波多野结衣网站| 99在线精品视频在线观看| 日韩视频亚洲视频| 久久久久久国产免费a片| 欧美成人一区在线观看| 日韩亚洲电影在线| 老司机久久精品| 欧美日韩在线精品一区二区三区激情综合 | 欧美日韩中文字幕一区| 欧美三级在线观看视频| 欧美黄色视屏| 亚洲靠逼com| 伊人久久婷婷色综合98网| 国产黄在线看| 久久女同互慰一区二区三区| 国产一区二区三区奇米久涩| 亚洲AV无码乱码国产精品牛牛 | 亚洲一区二区三区毛片| 中文字幕日本人妻久久久免费| 亚洲综合日韩| 欧洲美女免费图片一区| 九九热在线免费观看| 亚洲日韩视频| 97精品欧美一区二区三区| 久久亚洲成人av| 亚洲大胆视频| 91国产在线精品| 国产午夜精品无码| 最新日韩在线| 欧美中文字幕视频| 怡红院av久久久久久久| 爽好多水快深点欧美视频| 国产成+人+综合+亚洲欧洲 | 国产在线精品一区二区三区不卡| 国产精品揄拍一区二区| 在线观看视频二区| 麻豆中文一区二区| 成人性生交大片免费看小说| 99国产精品久久久久99打野战| 国内精品久久久久影院色| 成人性生交大片免费看视频直播| 国产高清精品软件丝瓜软件| 粉嫩高潮美女一区二区三区| 国产一区二区三区四区hd| 性高潮久久久久久久久久| 91在线国内视频| 欧美一区二区综合| 日本免费在线观看| 亚洲一区二区在线播放相泽| 久久成人免费观看| 深夜视频一区二区| 91精品国模一区二区三区| 佐佐木明希电影| 亚洲三级网址| 久久综合免费视频| 国产精品成人久久| 日韩国产欧美视频| 亚洲在线第一页| 天堂中文在线官网| 欧美激情一区二区| 日韩在线视频在线| 日韩免费电影| 欧美一区二区免费视频| 香蕉视频黄色在线观看| 久久一区91| 韩国精品久久久999| 亚洲免费视频二区| 大美女一区二区三区| 日韩国产一区久久| 欧美四级在线| 欧美视频自拍偷拍| 艳妇乳肉豪妇荡乳xxx| 欧美日韩有码| 美女黄色丝袜一区| 波多野结衣在线观看视频| 国产美女主播视频一区| 欧美日韩综合久久| 欧美人动性xxxxz0oz| 91成人在线精品| 古装做爰无遮挡三级聊斋艳谭| 久久悠悠精品综合网| 中文字幕亚洲图片| 欧美精品二区三区| 国产福利一区二区三区视频在线| 欧美一区二区三区在线播放| 国产网红在线观看| 欧美精品在线一区二区| 免费在线观看你懂的| 欧美日韩午夜| 成人欧美一区二区三区在线湿哒哒| 天天色天天操天天射| 亚洲欧美日韩久久| 黄色手机在线视频| 国产真实有声精品录音| 91超碰中文字幕久久精品| www.久久久久久| 国产精品久久久久aaaa| 欧美国产日韩在线播放| 欧美激情极品| 久久久亚洲国产| 国产富婆一级全黄大片| 国产精品久久久久aaaa| 国产九九在线观看| 精品一区av| 国产精品www网站| 男人久久精品| 粉嫩av一区二区三区免费野| 中文字幕免费在线播放| 国产综合色产| 动漫精品视频| 国产嫩草在线视频| 精品免费国产一区二区三区四区| 欧美日韩午夜视频| 精品夜夜嗨av一区二区三区| 亚洲精品一区二区三区樱花 | 亚洲一区免费网站| 黄在线免费看| 制服丝袜日韩国产| 少妇aaaaa| 国产成人在线视频网址| 欧美精品在欧美一区二区| 亚洲精选av| 国内精品久久久| 无码精品视频一区二区三区 | 亚洲欧美自拍另类日韩| 成人精品视频| 国产日韩欧美在线观看| 日本综合在线| 日韩一区二区三区在线观看| 麻豆亚洲av成人无码久久精品| 国产成人在线网站| 欧美成人三级在线视频| 亚洲人成伊人成综合图片| 国产精品国产亚洲伊人久久| 99视频在线观看地址| 911精品国产一区二区在线| 波多野结衣家庭教师| 国产超碰在线一区| 国产精品无码av在线播放| 天天躁日日躁成人字幕aⅴ| 国产91九色视频| 日本在线免费播放| 欧美精品一区二区久久久| 欧美一级特黄视频| 欧美激情一二三区| 激情成人在线观看| 日韩视频一区二区三区在线播放免费观看| 久久偷窥视频| 亚洲欧美久久精品| 久久久久久国产精品美女| 日本在线一二三| 欧美日韩一级二级三级| 久久久久久激情| 91亚洲永久精品| 日本黄大片一区二区三区| 欧美a级片网站| 久久伦理网站| 深夜福利亚洲| 91国内在线视频| 日韩在线免费电影| 精品盗摄一区二区三区| 亚洲成人av网址| 夜夜嗨av一区二区三区四季av| 成人免费网站黄| 国产一区不卡在线| 成熟老妇女视频| 欧美日韩免费| 婷婷五月色综合| 成人偷拍自拍| 国产精品小说在线| 高清在线视频不卡| 久久精品视频在线| 毛片免费在线观看| 日韩精品综合一本久道在线视频| 天天操天天干天天摸| 亚洲一区二区在线视频| 99久久精品久久亚洲精品| 91网上在线视频| 中文字幕 欧美 日韩| 免费不卡在线视频| 日本久久久精品视频| 国产精品v日韩精品v欧美精品网站 | 国产精品久久久久久亚洲调教 | 午夜亚洲福利| 亚洲综合欧美日韩| 免费欧美一区| 国产日韩欧美综合精品| 激情五月综合婷婷| 国产欧美精品一区二区| 欧美极品影院| 欧亚精品中文字幕| 成人bbav| 久久久久久18| 超碰在线观看免费版| 中文字幕欧美日韩精品 | x99av成人免费| 国产三级视频在线| 日韩美女av在线| 婷婷丁香花五月天| 精品国产91久久久久久久妲己| 国产永久免费视频| 欧美日韩精品电影| 中文字幕 国产精品| 色婷婷综合久久久中文一区二区| 国产成人亚洲精品自产在线 | 欧在线一二三四区| 国产亚洲一区在线| 成年人午夜视频在线观看| 黑人一区二区三区四区五区| 欧美亚洲视频一区| 91国语精品自产拍| 精品91一区二区三区| 欧美好骚综合网| 一本一本a久久| 欧美r级电影| 在线观看成人一级片| 97精品国产一区二区三区| 亚洲一二三区精品| 日韩在线综合| 日韩 欧美 自拍| 一区二区中文字| 久久久久久久久久久综合| 精品av久久久久电影| 久草免费福利在线| 99精品视频免费全部在线| 欧美日韩成人免费视频| 亚洲永久在线| 欧美精品成人网| 久久精品国产精品亚洲综合| 亚洲一二三不卡| 国产成人av电影在线播放| 97精品人人妻人人| 久久先锋影音av鲁色资源网| 美女爆乳18禁www久久久久久 | 国产精品亚洲一区二区三区在线 | 欧美精品激情在线| 97人澡人人添人人爽欧美| 91爱视频在线| 国产成人午夜性a一级毛片| 国产精品高清在线| 免费一区二区三区在线视频| 国产精品18毛片一区二区| 西瓜成人精品人成网站| 日韩精品久久久免费观看| 66视频精品| 国产精品999视频| 日本亚洲视频在线| 日本亚洲一区二区三区| 99精品偷自拍| 激情五月深爱五月| 亚洲一区二区三区四区五区黄 | mm视频在线视频| 国产精品1区2区在线观看| 精品视频一区二区三区| 国内外成人免费视频| 日本不卡免费一区| 国产精品va在线观看无码| 久久性天堂网| 亚洲一二三四五| 亚洲国产精品激情在线观看| 精品99久久久久成人网站免费| 欧美特黄级在线| 国产情侣激情自拍| 亚洲精品午夜精品| av网站大全在线| 国产精品91视频| 成人av动漫| 一本一道久久久a久久久精品91| 激情欧美日韩| 激情黄色小视频| 91视视频在线观看入口直接观看www| www.黄色com| 狠狠躁天天躁日日躁欧美| 国产男女猛烈无遮挡| 亚洲视频精品在线| missav|免费高清av在线看| 国产日韩在线亚洲字幕中文| 外国成人在线视频| 亚洲精品国产suv一区88| 日本成人在线一区| 亚洲色图14p| 一区二区三区欧美在线观看| 欧美另类高清videos的特点| 日韩av在线看| 久久99亚洲网美利坚合众国| 成人av在线亚洲| 欧美日中文字幕| 久久精品99国产| 波多野结衣中文字幕一区| 亚洲熟女www一区二区三区| 欧美亚洲综合久久| 日本不卡视频一区二区| 久久久久亚洲精品成人网小说| 91精品国产一区二区在线观看| 日韩免费电影一区二区| 先锋影音久久| 日本一卡二卡在线| 亚洲综合清纯丝袜自拍| 国产免费的av| www.色综合| 久久久免费人体| 亚洲欧美成人一区| 免费日本视频一区| 欧美福利第一页| 91久久精品国产91性色tv| 欧美少妇另类| 欧美自拍大量在线观看| 无码日韩精品一区二区免费| 人妻av中文系列| 99久久国产综合精品麻豆| 国产精品2020| 亚洲国产精品字幕| 末成年女av片一区二区下载| 国产伦精品一区二区三区免费视频 | 久久夜色精品国产亚洲aⅴ| 欧美风情在线视频| 亚洲在线视频一区二区| 久久国产精品色| 久久国产波多野结衣| 欧美一区二区三区公司| av网站在线看| 国产精品一区二区在线观看| 1024日韩| 欧美狂猛xxxxx乱大交3| 91福利小视频| 色视频在线免费观看| 成人亲热视频网站| 欧美理论在线| 亚洲一区二区三区综合| 色哟哟亚洲精品| av大片在线观看| 91亚洲精品久久久久久久久久久久| 亚洲最新色图| 久久性爱视频网站| 欧美日韩亚洲系列| av网在线观看| 91免费精品国偷自产在线| 欧美午夜精品| 久久无码人妻精品一区二区三区| 色婷婷av一区| 国产精品一区二区三区视频网站| 动漫3d精品一区二区三区| 国产午夜精品一区二区三区欧美| 久久中文字幕精品| 欧美一区二区三区免费视频 | 91精品亚洲| 国产精品久久AV无码| 欧美在线视频全部完| 99自拍视频在线观看| 久久99精品国产99久久| 奇米四色…亚洲| 妺妺窝人体色www聚色窝仙踪| 亚洲精品720p| 日韩毛片免费视频一级特黄| 国产日韩亚洲欧美在线| 久久影院午夜论| 国产精品视频a| 欧美在线免费视频| 91精品电影| 五月天精品视频| 欧美大片在线观看| 先锋欧美三级| 18禁裸男晨勃露j毛免费观看| 欧美韩国日本不卡| 粉嫩av一区二区夜夜嗨| 国产精品老女人视频| 亚洲婷婷在线| 成年人免费视频播放| 亚洲精品动漫100p| 成人av在线播放| 国产精品欧美激情在线观看|