日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hamcrest Matchers教程

發布時間:2023/12/3 编程问答 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hamcrest Matchers教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文是我們名為“ 用Mockito進行測試 ”的學院課程的一部分。

在本課程中,您將深入了解Mockito的魔力。 您將了解有關“模擬”,“間諜”和“部分模擬”的信息,以及它們相應的Stubbing行為。 您還將看到使用測試雙打和對象匹配器進行驗證的過程。 最后,討論了使用Mockito的測試驅動開發(TDD),以了解該庫如何適合TDD的概念。 在這里查看 !

在本教程中,我們將研究Hamcrest Matcher庫以及如何將其與JUnit和Mockito集成。

目錄

1.什么是Hamcrest? 2.包括Hamcrest 3.認識匹配者
3.1。 簡單匹配器 3.2。 簡單匹配器結合其他匹配器
4。結論

1.什么是Hamcrest?

Hamcrest是用于創建匹配對象的框架。 這些匹配器對象是謂詞,用于編寫在某些條件下可以滿足的規則。 它們通常用于自動化測試中,盡管它們可以用于其他情況下,例如數據驗證。 Hamcrest讓我們超越了簡單的JUnit斷言,并使我們能夠編寫非常具體,可讀的驗證代碼。

Hamcrest旨在使測試更具可讀性。 它充分利用靜態方法來創建斷言語法,該語法易于編寫和理解。 當與JUnit和Mockito結合使用時,它使我們能夠編寫清晰,簡潔的測試,以滿足“測試一件事”的良好單元測試的特性。

假設我們有一個String,我們想測試它是否與另一個期望的字符串相等,我們可以使用JUnit斷言來測試它:

assertEquals(expected, actual);

在Hamcrest中,我們使用JUnit assertThat(valueUnderTest, matcher)方法。 此方法始終構成Hamcrest斷言的基礎; 我們斷言被測值滿足匹配謂詞。 要在最基本的水平上用hamcrest重寫上述測試,我們可以編寫:

assertThat(actual, equalTo(expected));

注意assertThat約定將要測試的實際值作為第一個參數,這與assertEquals約定相反。 這是對可讀性的改進,但是Hamcrest還以is()匹配器的形式為我們提供了一些不錯的語法糖。 該匹配器本身不執行任何操作,它只是中繼其輸入匹配器的結果,從而使您的斷言代碼可以像英語一樣讀取。 讓我們使用is()重寫上面的內容:

assertThat(actual, is(equalTo(expected)));

很好,很可讀!

Hamcrest的匹配器失敗時,它會生成詳細的輸出,并指定期望值和實際值,以幫助您確定測試失敗的原因。 查看以下測試用例:

@Testpublic void test_failed() throws Exception {// GivenInteger number = 7;// ThenassertThat(number, greaterThan(10));}

顯然,該測試將失敗,但是Hamcrest將提供有關失敗的詳細信息:

java.lang.AssertionError: Expected: a value greater than <10>but: <7> was less than <10>

在本教程中,我們將遵循僅在一個單元測試中包含一個斷言的約定。 這似乎是重復的,尤其是在許多測試中測試的設置部分相同的情況下,但是這是單元測試中的良好做法。 它使我們能夠創建針對性的測試-僅當單個斷言失敗時,測試才會失敗,其他所有斷言將繼續執行。 它使我們能夠創建可讀的測試-我們可以一目了然地看到測試的目的。 它使我們能夠創建記錄代碼的測試-我們可以使用表達測試目的的測試名稱,從而傳達測試的詳細目的(請考慮customer_should_have_balance_updated_by_input_order_amount()而不是verifyOrderMethod() )。 它使我們能夠創建不易碎的測試-如果測試做得太多,則如果更改了不相關的功能,它可能會中斷,從而迫使我們重寫測試只是為了使其再次運行而無需更改實際的被測代碼。

如果我們遵循“測試一件事”的習慣,那么將來我們將編寫出更好的單元測試!

2.包括Hamcrest

如果使用的是Maven,則可以將Hamcrest添加到您的項目中,并且對pom.xml具有以下依賴性

<dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-all</artifactId><version>1.3</version></dependency>

如果您使用的是Gradle,請添加以下內容

dependencies {testCompile "org.hamcrest:hamcrest-all:1.3"}

要將hamcrest直接添加到項目的類路徑中,可以從https://code.google.com/p/hamcrest/下載hamcrest-all-1.3.jar到硬盤上的某個位置。

右鍵單擊您的eclipse項目,然后選擇“屬性”,然后在左窗格中選擇“ Java Build Path”,然后在右側選擇“ Libraries”。

在“庫”選項卡上,單擊“添加外部罐子”按鈕,然后導航到先前下載的所有hamcrest罐子。 選擇罐子,它現在已添加到您的項目中并可供使用。

請注意,JUnit與簡化版本的Hamcrest(Hamcrest Core)捆綁在一起,因此,如果JUnit出現在類路徑上的Hamcrest之前,則編譯器將選擇該版本。 為了解決這個問題,請確保Hamcrest在類路徑上的JUnit之前出現。 您可以在Maven中通過在所有其他依賴項之前列出hamcrest-all依賴項來實現此目的。

與Mockito靜態方法一樣,我們可以通過啟動Window-> Preferences并將Hamcrest庫添加到Eclipse內容輔助中,并轉到左側導航欄中的Java / Editor / Content Assist / Favorites。 之后,按照圖1添加以下內容作為“ New Type…”

  • org.hamcrest.Matchers

啟動Window-> Preferences,然后轉到左側導航欄中的Java / Editor / Content Assist / Favorites。 之后,按照圖1添加以下內容作為“ New Type…”

圖1 – Content Assist收藏夾

3.認識匹配者

Hamcrest提供了一個靜態工廠方法庫,用于在org.hamcrest.Matchers類中創建Matchers,因此您可以通過靜態導入引入所有Matchers

import static org.hamcrest.Matchers.*

但是,如果這樣做,則存在命名沖突的風險,因為Hamcrest和Mockito都提供了靜態的any()方法,因此建議導入您單獨使用的每個靜態方法。
現在,我們將在Hamcrest Matchers庫中查看所有可用的Matchers。 它們將分為兩大類: 用于測試值的匹配器(簡單),和用于組合其他匹配器(聚合)的匹配器。

簡單匹配器

以下匹配器主要用于測試輸入值。

3.1.1。 任何()

匹配給定類型的任何變量。

@Testpublic void test_any() throws Exception {// GivenString myString = "hello";// ThenassertThat(myString, is(any(String.class))); }

3.1.2。 任何東西()

匹配任何東西。

@Testpublic void test_anything() throws Exception {// GivenString myString = "hello";Integer four = 4;// ThenassertThat(myString, is(anything()));assertThat(four, is(anything()));}

3.1.3。 arrayContaining()

數組的各種匹配器,數組的長度必須匹配匹配器的數量,并且它們的順序很重要。

數組是否按輸入到匹配器的順序包含所有給定項目?

@Testpublic void test_arrayContaining_items() throws Exception {// GivenString[] strings = {"why", "hello", "there"};// ThenassertThat(strings, is(arrayContaining("why", "hello", "there")));}

數組中是否包含按順序匹配匹配器輸入列表的項目?

@Testpublic void test_arrayContaining_list_of_matchers() throws Exception {// GivenString[] strings = {"why", "hello", "there"};// Thenjava.util.List<org.hamcrest.Matcher<? super String>> itemMatchers = new ArrayList<>();itemMatchers.add(equalTo("why"));itemMatchers.add(equalTo("hello"));itemMatchers.add(endsWith("here"));assertThat(strings, is(arrayContaining(itemMatchers)));}

數組是否按順序包含與輸入vararg匹配器匹配的項目?

@Testpublic void test_arrayContaining_matchers() throws Exception {// GivenString[] strings = {"why", "hello", "there"};// ThenassertThat(strings, is(arrayContaining(startsWith("wh"), equalTo("hello"), endsWith("here"))));}

3.1.4。 arrayContainingInAnyOrder()

數組的各種匹配器,數組的長度必須匹配匹配器的數量,但是它們的順序并不重要。

數組是否包含所有給定項?

@Testpublic void test_arrayContainingInAnyOrder_items() throws Exception {// GivenString[] strings = { "why", "hello", "there" };// ThenassertThat(strings, is(arrayContainingInAnyOrder("hello", "there", "why")));}

數組中是否包含與Matchers的輸入集合匹配的項目?

@Testpublic void test_arrayContainingInAnyOrder_collection_of_matchers() throws Exception {// GivenString[] strings = { "why", "hello", "there" };// ThenSet<org.hamcrest.Matcher<? super String>> itemMatchers = new HashSet<>();itemMatchers.add(equalTo("hello"));itemMatchers.add(equalTo("why"));itemMatchers.add(endsWith("here"));assertThat(strings, is(arrayContainingInAnyOrder(itemMatchers)));}

數組是否包含與輸入vararg匹配器匹配的項目?

@Testpublic void test_arrayContainingInAnyOrder_matchers() throws Exception {// GivenString[] strings = { "why", "hello", "there" };// ThenassertThat(strings, is(arrayContainingInAnyOrder(endsWith("lo"), startsWith("the"), equalTo("why"))));}

3.1.5。 arrayWithSize()

各種匹配器,用于檢查數組是否具有特定長度。

輸入數組是否具有指定的長度?

@Testpublic void test_arrayWithSize_exact() throws Exception {// GivenString[] strings = { "why", "hello", "there" };// ThenassertThat(strings, is(arrayWithSize(3)));}

輸入數組的長度是否與指定的匹配項匹配?

@Testpublic void test_arrayWithSize_matcher() throws Exception {// GivenString[] strings = { "why", "hello", "there" };// ThenassertThat(strings, is(arrayWithSize(greaterThan(2))));}

3.1.6。 相近()

可以與Double或BigDecimal一起使用的匹配器,以檢查某個值是否在期望值的指定誤差范圍內。

@Testpublic void test_closeTo_double() throws Exception {// GivenDouble testValue = 6.3;// ThenassertThat(testValue, is(closeTo(6, 0.5)));}

大十進制

@Testpublic void test_closeTo_bigDecimal() throws Exception {// GivenBigDecimal testValue = new BigDecimal(324.0);// ThenassertThat(testValue, is(closeTo(new BigDecimal(350), new BigDecimal(50))));}

3.1.7。 comparesEqualTo()

創建一個Comparable匹配器,嘗試使用輸入值的compareTo()方法匹配輸入匹配器值。 如果compareTo()方法為輸入的匹配器值返回0,則匹配器將匹配,否則將不匹配。

@Testpublic void test_comparesEqualTo() throws Exception {// GivenString testValue = "value";// ThenassertThat(testValue, comparesEqualTo("value"));}

3.1.8。 contains()

各種匹配器,可用于檢查輸入Iterable是否包含值。 值的順序很重要,并且Iterable中的項目數必須與要測試的值數相匹配。

輸入列表是否按順序包含所有值?

@Testpublic void test_contains_items() throws Exception {// GivenList<String> strings = Arrays.asList("why", "hello", "there");// ThenassertThat(strings, contains("why", "hello", "there"));}

輸入列表中是否包含按順序匹配輸入匹配器列表中所有匹配器的項目?

@Testpublic void test_contains_list_of_matchers() throws Exception {// GivenList<String> strings = Arrays.asList("why", "hello", "there");// ThenList<org.hamcrest.Matcher<? super String>> matchers = new ArrayList<>();matchers.add(startsWith("wh"));matchers.add(endsWith("lo"));matchers.add(equalTo("there"));assertThat(strings, contains(matchers));}

輸入列表中是否僅包含與輸入匹配項匹配的一項?

@Testpublic void test_contains_single_matcher() throws Exception {// GivenList<String> strings = Arrays.asList("hello");// ThenassertThat(strings, contains(startsWith("he")));}

輸入列表中是否包含按順序匹配輸入vararg匹配器中所有匹配器的項?

@Testpublic void test_contains_matchers() throws Exception {// GivenList<String> strings = Arrays.asList("why", "hello", "there");// ThenassertThat(strings, contains(startsWith("why"), endsWith("llo"), equalTo("there")));}

3.1.9。 containsInAnyOrder()

各種匹配器,可用于檢查輸入Iterable是否包含值。 值的順序并不重要,但是Iterable中的項目數必須與要測試的值數相匹配。

輸入列表是否以任何順序包含所有值?

@Testpublic void test_containsInAnyOrder_items() throws Exception {// GivenList<String> strings = Arrays.asList("why", "hello", "there");// ThenassertThat(strings, containsInAnyOrder("hello", "there", "why"));}

輸入列表中是否包含與輸入匹配器列表中的所有匹配器按任何順序匹配的項目?

@Testpublic void test_containsInAnyOrder_list_of_matchers() throws Exception {// GivenList<String> strings = Arrays.asList("why", "hello", "there");// ThenList<org.hamcrest.Matcher<? super String>> matchers = new ArrayList<>();matchers.add(equalTo("there"));matchers.add(startsWith("wh"));matchers.add(endsWith("lo")); assertThat(strings, containsInAnyOrder(matchers));}

輸入列表中是否包含以任何順序匹配輸入vararg匹配器中所有匹配器的項目?

@Testpublic void test_containsInAnyOrder_matchers() throws Exception {// GivenList<String> strings = Arrays.asList("why", "hello", "there");// ThenassertThat(strings, containsInAnyOrder(endsWith("llo"), equalTo("there"), startsWith("why")));}

3.1.10。 containsString()

如果被測字符串包含給定的子字符串,則匹配的匹配器。

@Testpublic void test_containsString() throws Exception {// GivenString testValue = "value";// ThenassertThat(testValue, containsString("alu"));}

3.1.11。 空()

如果輸入Collections isEmpty()方法返回true,則匹配的匹配器。

@Testpublic void test_empty() throws Exception {// GivenSet<String> testCollection = new HashSet<>();// ThenassertThat(testCollection, is(empty()));}

3.1.12。 emptyArray()

如果輸入數組的長度為0,則匹配的匹配器。

@Testpublic void test_emptyArray() throws Exception {// GivenString[] testArray = new String[0];// ThenassertThat(testArray, is(emptyArray()));}

3.1.13。 emptyCollectionOf()

類型安全匹配器,如果輸入集合為給定類型且為空,則匹配。

@Testpublic void test_emptyCollectionOf() throws Exception {// GivenSet<String> testCollection = new HashSet<>();// ThenassertThat(testCollection, is(emptyCollectionOf(String.class)));}

3.1.14。 emptyIterable()

如果輸入Iterable沒有值,則匹配的匹配器。

@Testpublic void test_emptyIterable() throws Exception {// GivenSet<String> testCollection = new HashSet<>();// ThenassertThat(testCollection, is(emptyIterable()));}

3.1.15。 emptyIterableOf()

Typesafe Matcher,如果輸入的Iterable沒有值并且是給定類型,則匹配。

@Testpublic void test_emptyIterableOf() throws Exception {// GivenSet<String> testCollection = new HashSet<>();// ThenassertThat(testCollection, is(emptyIterableOf(String.class)));}

3.1.16。 以。。結束()

如果輸入String以給定的子字符串結尾,則匹配的匹配器。

@Testpublic void test_endsWith() throws Exception {// GivenString testValue = "value";// ThenassertThat(testValue, endsWith("lue"));}

3.1.17。 等于()

如果輸入值在邏輯上等于給定測試值,則匹配的匹配器。 也可以在數組上使用,在這種情況下,它將檢查數組的長度并確保輸入測試數組中的所有值在邏輯上都等于指定數組的值。

單值。

@Testpublic void test_equalTo_value() throws Exception {// GivenString testValue = "value";// ThenassertThat(testValue, equalTo("value"));}

數組。

@Testpublic void test_equalTo_array() throws Exception {// GivenString[] testValues = { "why", "hello", "there" };// ThenString[] specifiedValues = { "why", "hello", "there" };assertThat(testValues, equalTo(specifiedValues));}

3.1.18。 equalToIgnoringCase()

如果輸入的String值等于指定的String且忽略大小寫,則匹配的匹配器。

@Testpublic void test_equalToIgnoringCase() throws Exception {// GivenString testValue = "value";// ThenassertThat(testValue, equalToIgnoringCase("VaLuE"));}

3.1.19。 equalToIgnoringWhiteSpace()

如果輸入的String值等于指定的String而不匹配多余的空格,則匹配該匹配器。 忽略所有前導和尾隨空格,并將所有剩余空格折疊為單個空格。

@Testpublic void test_equalToIgnoringWhiteSpace() throws Exception {// GivenString testValue = "this is my value ";// ThenassertThat(testValue, equalToIgnoringWhiteSpace("this is my value"));}

3.1.20。 eventFrom()

如果輸入EventObject來自給定Source,則匹配的Matcher。 也可以接受指定子類型的EventObeject 。

@Testpublic void test_eventFrom() throws Exception {// GivenObject source = new Object();EventObject testEvent = new EventObject(source);// ThenassertThat(testEvent, is(eventFrom(source)));}

指定子類型。

@Testpublic void test_eventFrom_type() throws Exception {// GivenObject source = new Object();EventObject testEvent = new MenuEvent(source);// ThenassertThat(testEvent, is(eventFrom(MenuEvent.class, source)));}

3.1.21。 比...更棒()

如果輸入測試值大于指定值,則匹配的匹配器。

@Testpublic void test_greaterThan() throws Exception {// GivenInteger testValue = 5;// ThenassertThat(testValue, is(greaterThan(3)));}

3.1.22。 GreaterThanOrEqual()

如果輸入測試值大于或等于指定值,則匹配的匹配器。

@Testpublic void test_greaterThanOrEqualTo() throws Exception {// GivenInteger testValue = 3;// ThenassertThat(testValue, is(greaterThanOrEqualTo(3)));}

3.1.23。 hasEntry()

如果給定映射包含與指定鍵和值匹配的條目,則匹配的匹配器或匹配器。

實際值

@Testpublic void test_hasEntry() throws Exception {// GivenInteger testKey = 1;String testValue = "one";Map<Integer, String> testMap = new HashMap<>();testMap.put(testKey, testValue);// ThenassertThat(testMap, hasEntry(1, "one"));}

匹配器

@Testpublic void test_hasEntry_matchers() throws Exception {// GivenInteger testKey = 2;String testValue = "two";Map<Integer, String> testMap = new HashMap<>();testMap.put(testKey, testValue);// ThenassertThat(testMap, hasEntry(greaterThan(1), endsWith("o")));}

3.1.24。 hasItem()

如果輸入Iterable具有至少一個與指定值或匹配器匹配的項目,則匹配的匹配器。

實際價值

@Testpublic void test_hasItem() throws Exception {// GivenList<Integer> testList = Arrays.asList(1,2,7,5,4,8);// ThenassertThat(testList, hasItem(4));}

匹配器

@Testpublic void test_hasItem_matcher() throws Exception {// GivenList<Integer> testList = Arrays.asList(1,2,7,5,4,8);// ThenassertThat(testList, hasItem(is(greaterThan(6))));}

3.1.25。 hasItemInArray()

如果輸入數組具有至少一個與指定值或匹配器匹配的項目,則匹配的匹配器。

實際價值

@Testpublic void test_hasItemInArray() throws Exception {// GivenInteger[] test = {1,2,7,5,4,8};// ThenassertThat(test, hasItemInArray(4));}

匹配器

@Testpublic void test_hasItemInArray_matcher() throws Exception {// GivenInteger[] test = {1,2,7,5,4,8};// ThenassertThat(test, hasItemInArray(is(greaterThan(6))));}

3.1.26。 hasItems()

如果輸入Iterable具有任意順序的所有指定值或匹配器,則匹配的匹配器。

實際值

public void test_hasItems() throws Exception {// GivenList<Integer> testList = Arrays.asList(1,2,7,5,4,8);// ThenassertThat(testList, hasItems(4, 2, 5));}

匹配器

@Testpublic void test_hasItems_matcher() throws Exception {// GivenList<Integer> testList = Arrays.asList(1,2,7,5,4,8);// ThenassertThat(testList, hasItems(greaterThan(6), lessThan(2)));}

3.1.27。 hasKey()

如果輸入Map具有至少一個與指定值或匹配器匹配的鍵,則匹配器匹配。

實際價值

@Testpublic void test_hasKey() throws Exception {// GivenMap<String, String> testMap = new HashMap<>();testMap.put("hello", "there");testMap.put("how", "are you?");// ThenassertThat(testMap, hasKey("hello"));}

匹配器

@Testpublic void test_hasKey_matcher() throws Exception {// GivenMap<String, String> testMap = new HashMap<>();testMap.put("hello", "there");testMap.put("how", "are you?");// ThenassertThat(testMap, hasKey(startsWith("h")));}

3.1.28。 hasProperty()

如果輸入的Object滿足Bean Convention并具有指定名稱的屬性,并且該屬性的值可選地與指定的Matcher匹配,則匹配該Matcher。

物業名稱

@Testpublic void test_hasProperty() throws Exception {// GivenJTextField testBean = new JTextField();testBean.setText("Hello, World!");// ThenassertThat(testBean, hasProperty("text"));}

屬性名稱和值匹配器

@Testpublic void test_hasProperty_value() throws Exception {// GivenJTextField testBean = new JTextField();testBean.setText("Hello, World!");// ThenassertThat(testBean, hasProperty("text", startsWith("H")));}

3.1.29。 hasSize()

如果輸入Collection具有指定的大小,或者它的大小與指定的匹配器匹配,則匹配器。
實際價值

@Testpublic void test_hasSize() throws Exception {// GivenList<Integer> testList = Arrays.asList(1,2,3,4,5);// ThenassertThat(testList, hasSize(5));}

匹配器

@Testpublic void test_hasSize_matcher() throws Exception {// GivenList<Integer> testList = Arrays.asList(1,2,3,4,5);// ThenassertThat(testList, hasSize(lessThan(10)));}

3.1.30。 hasToString()

如果輸入對象的toString()方法匹配指定的String或輸入匹配器,則匹配的匹配器。

正常價值

@Testpublic void test_hasToString() throws Exception {// GivenInteger testValue = 4;// ThenassertThat(testValue, hasToString("4"));}

匹配器

@Testpublic void test_hasToString_matcher() throws Exception {// GivenDouble testValue = 3.14;// ThenassertThat(testValue, hasToString(containsString(".")));}

3.1.31。 hasValue()

如果輸入Map具有至少一個與指定值或匹配器匹配的值,則匹配的匹配器。

實際價值

@Testpublic void test_hasValue() throws Exception {// GivenMap<String, String> testMap = new HashMap<>();testMap.put("hello", "there");testMap.put("how", "are you?");// ThenassertThat(testMap, hasValue("there"));}

匹配器

@Testpublic void test_hasValue_matcher() throws Exception {// GivenMap<String, String> testMap = new HashMap<>();testMap.put("hello", "there");testMap.put("how", "are you?");// ThenassertThat(testMap, hasValue(containsString("?")));}

3.1.32。 hasXPath()

如果輸入XML DOM節點滿足輸入XPath表達式,則匹配的匹配器。

節點是否包含與輸入XPath表達式匹配的節點?

@Testpublic void test_hasXPath() throws Exception {// GivenDocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();Node testNode = docBuilder.parse(new InputSource(new StringReader("<xml><top><middle><bottom>value</bottom></middle></top></xml>"))).getDocumentElement();// ThenassertThat(testNode, hasXPath("/xml/top/middle/bottom"));}

Node是否包含與輸入XPath表達式匹配的Node,并且該Node的值是否與指定的匹配器匹配?

@Testpublic void test_hasXPath_matcher() throws Exception {// GivenDocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();Node testNode = docBuilder.parse(new InputSource(new StringReader("<xml><top><middle><bottom>value</bottom></middle></top></xml>"))).getDocumentElement();// ThenassertThat(testNode, hasXPath("/xml/top/middle/bottom", startsWith("val")));}

節點是否在指定的名稱空間中包含與輸入XPath表達式匹配的節點?

@Test public void test_hasXPath_namespace() throws Exception {// GivenDocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();docFactory.setNamespaceAware(true);DocumentBuilder docBuilder = docFactory.newDocumentBuilder();Node testNode = docBuilder.parse(new InputSource(new StringReader("<xml xmlns:prefix='http://namespace-uri'><top><middle><prefix:bottom>value</prefix:bottom></middle></top></xml>"))).getDocumentElement();NamespaceContext namespace = new NamespaceContext() {public String getNamespaceURI(String prefix) {return "http://namespace-uri";}public String getPrefix(String namespaceURI) {return null;}public Iterator<String> getPrefixes(String namespaceURI) {return null;}};// ThenassertThat(testNode, hasXPath("//prefix:bottom", namespace)); }

Node是否在指定的名稱空間中包含一個與輸入XPath表達式匹配的Node,并且該Node的值是否與指定的Matcher匹配?

@Test public void test_hasXPath_namespace_matcher() throws Exception {// GivenDocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();docFactory.setNamespaceAware(true);DocumentBuilder docBuilder = docFactory.newDocumentBuilder();Node testNode = docBuilder.parse(new InputSource(new StringReader("<xml xmlns:prefix='http://namespace-uri'><top><middle><prefix:bottom>value</prefix:bottom></middle></top></xml>"))).getDocumentElement();NamespaceContext namespace = new NamespaceContext() {public String getNamespaceURI(String prefix) {return "http://namespace-uri";}public String getPrefix(String namespaceURI) {return null;}public Iterator<String> getPrefixes(String namespaceURI) {return null;}};// ThenassertThat(testNode, hasXPath("//prefix:bottom", namespace, startsWith("val"))); }

3.1.33。 instanceOf()

如果輸入對象是給定類型,則匹配器。

@Test public void test_instanceOf() throws Exception {// GivenObject string = "Hello, World!";// ThenassertThat(string, instanceOf(String.class)); }

3.1.34。 isEmptyOrNullString()

當輸入字符串為空或null時匹配的匹配器。

@Test public void test_isEmptyOrNullString() throws Exception {// GivenString emptyString = ";String nullString = null;// ThenassertThat(emptyString, isEmptyOrNullString());assertThat(nullString, isEmptyOrNullString()); }

3.1.35。 isEmptyString()

當輸入字符串為空時匹配的匹配器。

@Test public void test_isEmptyString() throws Exception {// GivenString emptyString = ";// ThenassertThat(emptyString, isEmptyString()); }

3.1.36。 isIn()

當在給定的Collection或Array中找到輸入項時匹配的匹配器。

@Test public void test_isIn() throws Exception {// GivenSet<Integer> set = new HashSet<>();set.add(3);set.add(6);set.add(4);// ThenassertThat(4, isIn(set)); }

3.1.37。 是其中之一()

當輸入對象是給定對象之一時匹配的匹配器。

@Test public void test_isOneOf() throws Exception {// ThenassertThat(4, isOneOf(3,4,5)); }

3.1.38。 iterableWithSize()

當輸入Iterable具有指定大小時匹配或與指定大小匹配器匹配的匹配器。

實際價值

@Test public void test_iterableWithSize() throws Exception {// GivenSet<Integer> set = new HashSet<>();set.add(3);set.add(6);set.add(4);// ThenassertThat(set, iterableWithSize(3)); }

匹配器

@Test public void test_iterableWithSize_matcher() throws Exception {// GivenSet<Integer> set = new HashSet<>();set.add(3);set.add(6);set.add(4);// ThenassertThat(set, iterableWithSize(lessThan(4))); }

3.1.39。 少于()

匹配器,使用compareTo方法匹配輸入對象小于指定值的可比較對象。

@Test public void test_lessThan() throws Exception {// ThenassertThat("apple", lessThan("zoo")); }

3.1.40。 lessThanOrEqualTo()

匹配器,使用compareTo方法匹配輸入對象小于或等于指定值的可比較對象。

@Test public void test_lessThanOrEqualTo() throws Exception {// ThenassertThat(2, lessThanOrEqualTo(2)); }

3.1.41。 不()

包裹現有匹配器并反轉其匹配邏輯的匹配器

@Test public void test_not_matcher() throws Exception {// ThenassertThat("zoo", not(lessThan("apple"))); }

當與值而不是匹配器一起使用時,也是not(equalTo(...))的別名

@Test public void test_not_value() throws Exception {// ThenassertThat("apple", not("orange")); }

3.1.42。 notNullValue()

當輸入值不為null時匹配的匹配器。

@Test public void test_notNullValue() throws Exception {// ThenassertThat("apple", notNullValue()); }

3.1.43。 nullValue()

當輸入值為null時匹配的匹配器。

@Test public void test_nullValue() throws Exception {// GivenObject nothing = null;// ThenassertThat(nothing, nullValue()); }

3.1.44。 sameInstance()

當輸入對象與指定值相同的實例時匹配的匹配器。

@Test public void test_sameInstance() throws Exception {// GivenObject one = new Object();Object two = one;// ThenassertThat(one, sameInstance(two)); }

3.1.45。 samePropertyValuesAs()

當輸入Bean具有與指定Bean相同的屬性值時匹配的匹配項,即,如果被測Bean上具有屬性,則它們必須存在,并且具有與在測試條件中指定的Bean相同的值。

給定以下Java類:

public class Bean {private Integer number;private String text;public Integer getNumber() {return number;}public void setNumber(Integer number) {this.number = number;}public String getText() {return text;}public void setText(String text) {this.text = text;} }

我們可以編寫以下測試:

@Testpublic void test_samePropertyValuesAs() throws Exception {// GivenBean one = new Bean();one.setText("text");one.setNumber(3);Bean two = new Bean();two.setText("text");two.setNumber(3);// ThenassertThat(one, samePropertyValuesAs(two));}

3.1.46。 以。。開始()

如果輸入字符串以給定前綴開頭的匹配項。

@Testpublic void test_startsWith() throws Exception {// GivenString test = "Beginnings are important!";// ThenassertThat(test, startsWith("Beginning"));}

3.1.47。 stringContainsInOrder()

如果輸入String包含給定Iterable中的子字符串,則按從Iterable返回的順序進行匹配的Matcher。

@Testpublic void test_stringContainsInOrder() throws Exception {// GivenString test = "Rule number one: two's company, but three's a crowd!";// ThenassertThat(test, stringContainsInOrder(Arrays.asList("one", "two", "three")));}

3.1.48。 theInstance()

當輸入對象與指定值相同的實例時匹配的匹配器。 行為與“ sameInstance()”相同

@Test public void test_theInstance() throws Exception {// GivenObject one = new Object();Object two = one;// ThenassertThat(one, theInstance(two)); }

3.1.49。 typeCompatibleWith()

當輸入類型的對象可以分配給指定基本類型的引用時匹配的匹配器。

@Testpublic void test_typeCompatibleWith() throws Exception {// GivenInteger integer = 3;// ThenassertThat(integer.getClass(), typeCompatibleWith(Number.class));}

簡單匹配器結合其他匹配器

以下匹配器主要用于組合其他匹配器。

3.2.1。 所有的()

當所有輸入Matchers都匹配時匹配的Matcher的行為類似于邏輯AND。 可以使用單個Matchers或Iterable Matchers。

個人匹配器

@Testpublic void test_allOf_individual() throws Exception {// GivenString test = "starting off well, gives content meaning, in the end";// ThenassertThat(test, allOf(startsWith("start"), containsString("content"), endsWith("end")));}

匹配器的迭代

@Testpublic void test_allOf_iterable() throws Exception {// GivenString test = "Hello, world!";List<Matcher<? super String>> matchers = Arrays.asList(containsString("world"), startsWith("Hello"));// ThenassertThat(test, allOf(matchers));}

3.2.2。 任何()

當任何輸入匹配器匹配時匹配的匹配器,其行為類似于邏輯或。 可以使用單個Matchers或Iterable Matchers。

個人匹配器

@Testpublic void test_anyOf_individual() throws Exception {// GivenString test = "Some things are present, some things are not!";// ThenassertThat(test, anyOf(containsString("present"), containsString("missing")));}

匹配器的迭代

@Testpublic void test_anyOf_iterable() throws Exception {// GivenString test = "Hello, world!";List<Matcher<? super String>> matchers = Arrays.asList(containsString("Hello"), containsString("Earth"));// ThenassertThat(test, anyOf(matchers));}

3.2.3。 array()

當輸入數組的元素分別使用指定的Matchers依次進行匹配時匹配的Matcher。 匹配器的數量必須等于數組的大小。

@Testpublic void test_array() throws Exception {// GivenString[] test = {"To be", "or not to be", "that is the question!"};// ThenassertThat(test, array(startsWith("To"), containsString("not"), instanceOf(String.class)));}

3.2.4。 都()

匹配器,當與它的可組合匹配器.and()結合使用時,將在兩個指定匹配器匹配時匹配。

@Testpublic void test_both() throws Exception {// GivenString test = "Hello, world!";// ThenassertThat(test, both(startsWith("Hello")).and(endsWith("world!")));}

3.2.5。 要么()

匹配器,當與它的可組合匹配器.or()結合使用時,如果指定的匹配器匹配,則匹配器。

@Testpublic void test_either() throws Exception {// GivenString test = "Hello, world!";// ThenassertThat(test, either(startsWith("Hello")).or(endsWith("universe!")));}

3.2.6。 is()

當輸入匹配器匹配時匹配的匹配器,只是為了方便起見,使斷言更像英語。

@Testpublic void test_is_matcher() throws Exception {// GivenInteger test = 5;// ThenassertThat(test, is(greaterThan(3)));}

也用作is(equalTo(...))的別名,類似于not(...)和not(equalTo(...))

@Testpublic void test_is_value() throws Exception {// GivenInteger test = 5;// ThenassertThat(test, is(5));}

3.2.7。 被形容為()

匹配器,用于覆蓋另一個匹配器的失敗輸出。 在需要自定義故障輸出時使用。 參數是失敗消息,原始Matcher,然后是將使用占位符%0,%1,%2格式化為失敗消息的所有值。

@Testpublic void test_describedAs() throws Exception {// GivenInteger actual = 7;Integer expected = 10;// ThenassertThat(actual, describedAs("input > %0", greaterThan(expected), expected));}

4。結論

現在,我們訪問了Hamcrest中定義的所有Matchers,并看到了每個匹配器的示例。 庫中有很多非常有用且功能強大的Matchers,尤其是當彼此結合使用時。 但是有時我們需要做的比現有的要多。 在下一個教程中,我們將研究如何創建自己的自定義Matchers,以擴展Hamcrest并使它更加有用!

翻譯自: https://www.javacodegeeks.com/2015/11/hamcrest-matchers-tutorial.html

總結

以上是生活随笔為你收集整理的Hamcrest Matchers教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

手机av片| 日日夜夜精品视频天天综合网 | 最近中文字幕第一页 | 国产 字幕 制服 中文 在线 | 在线观看视频免费播放 | 在线看片日韩 | 麻豆影视网 | 成人a在线观看高清电影 | 综合久久五月天 | 探花视频在线版播放免费观看 | 超碰在线1 | 国产品久精国精产拍 | 99精品视频在线观看视频 | 日日夜色 | 国产亚洲一区二区在线观看 | 日韩精品视频在线观看网址 | 高清不卡毛片 | 99这里有精品 | 日韩一级网站 | 久久精品一区二区三区国产主播 | 综合网中文字幕 | 亚洲永久精品一区 | 992tv又爽又黄的免费视频 | 在线观看国产一区 | 97视频在线观看视频免费视频 | 日韩欧美视频在线免费观看 | 毛片a级片 | 91九色视频导航 | 日韩在线免费视频观看 | 久久九精品 | 一区二区成人国产精品 | 97av.com| 国产精品一区二区久久国产 | 91在线播 | 国产精成人品免费观看 | 亚洲va综合va国产va中文 | 中文字幕免费高清av | 在线成人高清电影 | 人人插人人插 | 精品一区二区久久久久久久网站 | 国产一级一级国产 | 日本乱视频 | 久久免费a| 免费在线国产视频 | 国产午夜精品在线 | 久草在线视频精品 | 日日操日日插 | 久久精品国产免费看久久精品 | 日韩中文字 | 97干com| 婷婷久久一区二区三区 | 国产小视频在线免费观看 | 少妇bbbb搡bbbb搡bbbb | a级片网站| freejavvideo日本免费 | 亚洲精品美女久久 | 在线v片免费观看视频 | 日韩伦理一区二区三区av在线 | 久久精品99国产 | 黄色成人免费电影 | 亚洲欧美日韩不卡 | 综合天天久久 | 91精品国自产在线偷拍蜜桃 | 中文在线免费一区三区 | 天天操天天操天天操天天操 | 国产精品自产拍在线观看桃花 | 国产精品精品久久久久久 | 成人在线一区二区三区 | a黄色 | 国产精国产精品 | 超碰人人乐 | 天天操夜 | 91在线视频免费观看 | 激情在线免费视频 | 日日干网 | 美女免费视频一区 | 日韩av片在线 | 亚洲精品一区二区三区高潮 | 日韩精品视频免费 | 91高清在线 | 精品999在线观看 | 精品久久精品久久 | 久久精品牌麻豆国产大山 | 国产精品色视频 | 欧美与欧洲交xxxx免费观看 | 91高清视频免费 | 国产在线一区二区 | 日韩高清无线码2023 | 成人三级黄色 | 精品视频久久 | 日本爱爱免费 | 色狠狠婷婷| 日韩欧美视频免费在线观看 | 九九免费观看全部免费视频 | 啪啪精品 | 欧美日韩视频观看 | 亚洲狠狠丁香婷婷综合久久久 | 97偷拍在线视频 | 久久这里只有精品久久 | 国产专区在线看 | 日韩区在线观看 | 久久成人人人人精品欧 | 国产91精品久久久久久 | 成人精品999| 中文字幕色在线视频 | 久草久草视频 | 亚洲欧美日韩在线一区二区 | 亚洲高清免费在线 | 午夜视频福利 | 国产日本亚洲高清 | 久久理论影院 | 亚洲电影免费 | 五月婷婷中文网 | 在线观看国产一区 | 精品国产亚洲一区二区麻豆 | 五月天六月丁香 | 97涩涩视频 | 亚洲国产精品影院 | 一区二区三区免费在线观看视频 | 五月婷婷电影网 | 一区二区三区影院 | 免费在线激情电影 | 最近中文字幕视频完整版 | 久久久久国产成人免费精品免费 | 婷久久 | 国产99爱| 国产a视频免费观看 | 免费男女羞羞的视频网站中文字幕 | 超碰在线9 | 国产大陆亚洲精品国产 | 91麻豆精品一区二区三区 | 亚洲毛片在线观看. | 天天色综合三 | 狠狠干综合网 | 精品国产免费av | 91精品一区二区在线观看 | a级免费观看 | 四虎影视成人精品 | 国内精品中文字幕 | 精品国产123| 九七在线视频 | japanesefreesex中国少妇 | 国产精品一区二区三区免费看 | 国产精品成久久久久三级 | 夜夜操网 | 国产免费久久久久 | 亚洲三级黄 | 三级午夜片 | 麻花豆传媒mv在线观看网站 | 美女视频黄的免费的 | 91在线观看高清 | 日韩亚洲在线 | 男女免费av | 亚洲不卡123| av不卡中文 | 久久精品艹 | 99精品一级欧美片免费播放 | 中文字幕影片免费在线观看 | 日韩精品中文字幕有码 | 91色偷偷 | 色九九视频 | 欧美激情视频一二三区 | 国产专区视频 | 手机看片久久 | 91精品1区2区 | 国产视频亚洲精品 | 久久久这里有精品 | 狠狠躁18三区二区一区ai明星 | 91在线中文字幕 | 国产不卡视频在线 | 日韩高清在线一区二区 | 国产伦精品一区二区三区… | 国产高清黄色 | 国产99久久久国产精品成人免费 | 天天草天天草 | 五月天狠狠操 | 国产永久网站 | 日日爽| 国产成人av综合色 | 久久久久久久久久久久久久免费看 | 97操碰| 一区二区三区 亚洲 | 在线黄色av电影 | 日韩色爱 | 四虎成人精品永久免费av | 欧美成人69av | 成人在线视 | 开心丁香婷婷深爱五月 | 国产精品资源在线 | 欧美 国产 视频 | 国产91丝袜在线播放动漫 | 99免费国产 | 成人av在线电影 | 国产999精品久久久久久绿帽 | 精品一区二区久久久久久久网站 | 五月婷婷综合在线 | 久久久久久久久爱 | 中文字幕色播 | 婷婷在线综合 | 欧美一级久久 | 亚洲人人爱| 亚洲欧美经典 | 成人中文字幕在线观看 | 精品亚洲视频在线 | 日韩精品在线视频 | 亚洲妇女av | 99精品视频在线免费观看 | 久草在线最新免费 | 国产精品成人免费一区久久羞羞 | 亚洲精品综合在线 | 久久不卡国产精品一区二区 | 粉嫩av一区二区三区免费 | 成人一级片视频 | 国产精品久久久久av | 午夜av免费在线观看 | 欧洲高潮三级做爰 | 中文字幕一区二区三区视频 | 国产精品免费观看在线 | 麻豆免费视频网站 | 国产精彩视频一区 | 天天射天天色天天干 | 色悠悠久久综合 | 麻豆成人精品视频 | 在线视频 你懂得 | 久久久久国产一区二区 | 伊香蕉大综综综合久久啪 | 18pao国产成视频永久免费 | 一区二区三区免费在线观看视频 | 粉嫩av一区二区三区免费 | 亚洲精品乱码久久久久久高潮 | av怡红院 | 日日爽日日操 | 久久麻豆视频 | 在线观看免费av网站 | 中文字幕免费一区 | 毛片一区二区 | 亚洲第一久久久 | 四虎免费在线观看视频 | a黄色一级 | 丁香五月缴情综合网 | 天天干天天干天天 | 国内亚洲精品 | 日韩一级电影网站 | 婷婷综合在线 | 色全色在线资源网 | 日韩欧美精选 | 综合精品在线 | 午夜精品久久久久久久久久 | 免费精品国产 | 久久中文字幕在线视频 | 日韩高清不卡一区二区三区 | 免费av 在线 | aa一级片| 亚洲最新视频在线 | 欧美激情精品久久久久久免费印度 | 天天操天天添天天吹 | 999久久久久久久久 69av视频在线观看 | 黄色av电影免费观看 | 亚洲综合五月天 | 操碰av| 久久国产精品影视 | 国产第一页在线观看 | www.久久色 | 手机看片| 日韩大片在线免费观看 | www.av免费观看 | 亚洲成人av在线电影 | 免费成人结看片 | 成人黄色小说视频 | 毛片激情永久免费 | 51久久成人国产精品麻豆 | 免费a级毛片在线看 | 欧产日产国产69 | 午夜精品视频一区二区三区在线看 | 国产二区电影 | 久久激情小视频 | 一区二区视频欧美 | 国产精品av电影 | 色婷婷婷 | 五月激情婷婷丁香 | 蜜臀av免费一区二区三区 | 亚洲成人免费在线 | 99精品久久只有精品 | 欧美一区二区精美视频 | 久久久久色 | 亚洲欧洲国产视频 | 伊人色播 | 91传媒激情理伦片 | 蜜臀av在线一区二区三区 | 亚洲免费视频观看 | 久热只有精品 | 主播av在线 | av黄在线播放 | 人人狠狠综合久久亚洲婷 | 四虎www | 西西4444www大胆艺术 | 99亚洲国产精品 | www黄免费 | 亚洲日韩欧美视频 | 精品xxx | 日韩一区二区免费视频 | 日韩一区二区免费播放 | 亚洲黄色激情小说 | 国产精品女教师 | 在线亚洲小视频 | 成年人电影毛片 | 色狠狠综合天天综合综合 | 成人三级视频 | 奇米影视777四色米奇影院 | 国产黄色精品在线 | 日本不卡视频 | 最新久久免费视频 | 韩国精品福利一区二区三区 | 国产精品久久久久一区二区 | 99精品国产99久久久久久福利 | 999成人 | 成人九九视频 | 日韩 在线观看 | 深爱激情五月综合 | 婷婷丁香七月 | 国产高清视频在线观看 | 精品国产区 | 日韩一区二区三区不卡 | 2019免费中文字幕 | 日本老少交| 天天夜夜操 | 成人aⅴ视频| 免费日韩 精品中文字幕视频在线 | 天天综合操 | 日本久久久亚洲精品 | 国产 日韩 欧美 中文 在线播放 | 一二区av | 国产高清视频在线播放一区 | 亚洲精品久久久久中文字幕m男 | 97久久精品午夜一区二区 | av免费看在线 | 999精品视频 | 中文字幕一区二区三区乱码在线 | 久久免费高清视频 | 成人av中文字幕在线观看 | 亚a在线 | 一区 二区 精品 | 国产乱对白刺激视频在线观看女王 | 久久综合桃花 | 黄色亚洲在线 | 午夜视频在线瓜伦 | 在线视频手机国产 | 国产一级在线视频 | 免费观看一级特黄欧美大片 | 欧美天堂视频在线 | 国产精品麻豆果冻传媒在线播放 | 一本一道波多野毛片中文在线 | 色欧美日韩 | 国产日韩欧美中文 | 国产精品九九九 | 波多野结衣在线视频一区 | 欧美色一色 | 成人a在线| 亚洲在线高清 | 国产精品欧美一区二区三区不卡 | 亚洲一区二区视频在线播放 | 91麻豆免费看 | 狠狠躁18三区二区一区ai明星 | 最近中文字幕mv免费高清在线 | 97天天综合网 | 欧美性春潮 | 色片网站在线观看 | 最新av网站在线观看 | 婷婷久久网 | 中文字幕观看视频 | 成人av免费在线看 | 成人在线视频观看 | 人人爱夜夜操 | 91传媒在线播放 | 精品国产一区二区三区不卡 | 精品国产伦一区二区三区观看说明 | 91av网址| 日本夜夜草视频网站 | 欧美最猛性xxxx | 欧美日韩1区 | 国产在线观看你懂的 | 精品日韩在线一区 | 亚洲精品视频在线观看网站 | 免费合欢视频成人app | 久久国产经典视频 | 久久久久久久久久久电影 | 播五月婷婷| 国内精品久久久久影院日本资源 | 91大神在线看 | 国产剧情在线一区 | 久久免费成人精品视频 | 亚洲激情六月 | 国产精品18毛片一区二区 | 色午夜 | 免费在线精品视频 | 麻豆超碰 | 精品成人a区在线观看 | 中文字幕在线播放一区二区 | 国产精品美女久久久久久网站 | 久久99国产精品自在自在app | 久久久久久久久精 | 亚洲国产日韩一区 | 成人啪啪18免费游戏链接 | 香蕉影院在线观看 | 久久精品一区二区三区视频 | 国产免费作爱视频 | 狠狠色丁香久久婷婷综合_中 | 久久久片 | 久久免费视频1 | 国产午夜精品在线 | www.久久久.cum | 丝袜av网站 | 探花视频在线观看免费版 | 9色在线视频 | 91精品久久久久久粉嫩 | 久久综合欧美精品亚洲一区 | 97在线精品 | 亚洲午夜精品一区二区三区电影院 | 久艹视频在线观看 | 免费色网 | 亚洲在线激情 | 中文欧美字幕免费 | 国产麻豆电影在线观看 | 国产精品欧美久久久久无广告 | 久久99视频| 成人中文字幕在线 | 精品久久久久久亚洲综合网站 | 久久视频这里有久久精品视频11 | 天天躁日日躁狠狠躁av麻豆 | 91视频免费观看 | 波多野结衣一区二区三区中文字幕 | 91精品国产欧美一区二区成人 | 国产精品久久久久久久久免费 | 久草在线官网 | 黄色片网站免费 | 日韩av资源站 | 久久视频这里有精品 | 91av在线免费播放 | 亚洲三级在线 | 成人午夜精品久久久久久久3d | 免费亚洲成人 | 亚洲一片黄 | 狠狠狠狠狠狠干 | 久久a热6 | 婷婷资源站 | 日韩在线观看影院 | 丰满少妇对白在线偷拍 | 9999精品免费视频 | 四虎国产精| 亚洲天堂网在线播放 | 在线观看亚洲免费视频 | 免费一区在线 | 五月天婷婷在线播放 | 成人国产在线 | 在线国产高清 | 能在线看的av | 激情欧美一区二区三区 | 成片免费观看视频 | 日韩无在线 | 九九在线精品视频 | 一级黄色片在线观看 | 欧美视频在线二区 | av中文字幕在线免费观看 | 黄色高清视频在线观看 | 成人免费视频网站 | 狠狠色综合欧美激情 | 欧美日韩在线精品一区二区 | 色a网| 91黄色小网站| 美女视频久久 | 久草免费在线观看视频 | 日韩精品在线免费观看 | 激情综合一区 | 国产精品九九视频 | 天天看天天干 | 97热久久免费频精品99 | 久久免费视频2 | 国产一级视频在线免费观看 | 天天操婷婷 | 国产一区二区电影在线观看 | av在线收看 | 在线天堂中文在线资源网 | 五月天久久婷婷 | 国产网站av| 最近中文字幕在线播放 | 亚洲精品午夜久久久久久久久久久 | 黄色亚洲在线 | 成人在线播放av | 91精品久久久久久久久久久久久 | 人人澡人人草 | avv天堂| www日韩视频| 国产精品视频久久久 | 欧美激情第八页 | 国产精品美女久久久久久免费 | av在线激情| 丁香六月综合网 | 毛片永久免费 | 日韩av看片| 国产小视频你懂的在线 | caobi视频| 韩国三级在线一区 | 午夜国产在线观看 | 黄色官网在线观看 | 日本一区二区高清不卡 | 黄色毛片在线看 | 狠狠操狠狠干天天操 | 国产精品视频最多的网站 | 韩国av一区二区三区在线观看 | 久久五月激情 | 久操中文字幕在线观看 | 国产在线一区观看 | 天天爽夜夜爽人人爽一区二区 | 国产麻豆成人传媒免费观看 | 色婷婷午夜| 9在线观看免费高清完整 | 一区二区视频电影在线观看 | 国产精品久久 | 日韩精品中文字幕在线播放 | 91亚色免费视频 | 97超碰资源 | 狠狠干天天操 | 久久人人爽av | 在线电影91| 在线观看黄网 | 高清国产在线一区 | av网址最新 | 在线观看视频一区二区 | 66av99精品福利视频在线 | 久久热亚洲 | 人人超碰人人 | 在线看国产日韩 | 亚洲黄色软件 | 97国产电影 | 亚洲精品视频一 | 丰满少妇麻豆av | 国产黄色观看 | 免费观看v片在线观看 | 日韩.com| 精品久久久久久久久中文字幕 | 国产成人精品免高潮在线观看 | 久草在线播放视频 | 午夜精品福利影院 | 精品久久久久久国产偷窥 | 日韩在线不卡 | 国产1区2 | 久久久久欧美精品999 | 免费av成人在线 | 狠狠狠操 | 中文字幕观看在线 | 高清不卡一区二区在线 | 国产糖心vlog在线观看 | 日韩r级电影在线观看 | 午夜黄色大片 | 九九久| 久久99久久久久 | 成人一区二区在线观看 | 国外调教视频网站 | 国产福利一区在线观看 | 亚洲精品成人在线 | 日韩免费一区二区在线观看 | 日本免费一二三区 | 久久国产精品色婷婷 | 久久久男人的天堂 | 久久免费av电影 | 亚洲精品激情 | 九九99靖品 | 91传媒91久久久 | 九九热免费精品视频 | 日韩理论电影在线观看 | 欧美激情精品久久久久久变态 | 国产麻豆果冻传媒在线观看 | 高清国产在线一区 | 亚洲无吗av | 免费黄色网止 | 欧美在线视频一区二区 | 国产中文字幕在线 | 国产一区二区在线视频观看 | 日韩丝袜在线 | 久久久精品在线观看 | 视频在线观看99 | 午夜在线观看一区 | 久久久久久久国产精品视频 | 国产小视频你懂的在线 | 国产真实精品久久二三区 | 99在线精品免费视频九九视 | 五月天狠狠操 | 天天干,天天射,天天操,天天摸 | 激情视频二区 | 一区 二区 精品 | 久久久久久网址 | 久久精品系列 | 欧美一级在线 | 四川妇女搡bbbb搡bbbb搡 | 亚州精品天堂中文字幕 | 亚洲视频免费在线 | 91精品人成在线观看 | 国产精品美女久久久久久久久久久 | 中文字幕在线视频网站 | 亚洲日本韩国一区二区 | 免费观看日韩 | 日韩在线网 | 天天射色综合 | 欧美久久久久久久久 | 四月婷婷在线观看 | 免费网站黄| 成人午夜在线电影 | 欧美福利精品 | 亚洲精选久久 | 最近2019好看的中文字幕免费 | 97视频久久久 | 97久久精品午夜一区二区 | 久久综合色综合88 | www99精品| 国内精品久久影院 | 麻豆一精品传二传媒短视频 | 91九色自拍 | 久久久久久久久久免费 | 亚洲一级片av | av片在线观看 | 亚洲一级影院 | 国产成人久久精品77777综合 | 免费观看一级视频 | 91色吧 | 亚洲九九爱 | 九九热在线精品视频 | 成片免费观看视频999 | www.色午夜| 在线观看一级片 | 在线免费中文字幕 | 日韩欧美精品在线观看视频 | 婷婷久久网站 | 亚洲福利精品 | 日韩网站中文字幕 | 狠狠色噜噜狠狠狠狠 | 国产青春久久久国产毛片 | 午夜精品久久久久99热app | 色婷婷激婷婷情综天天 | 97超碰资源网 | 久九视频 | 成人av免费在线播放 | 亚洲成人av一区 | 日韩一级理论片 | 日本精品一区二区在线观看 | 在线视频一区二区 | 91久久奴性调教 | 91干干干 | 激情丁香综合五月 | 永久免费在线 | av色综合网 | 96精品在线 | 天天天干夜夜夜操 | 激情网婷婷 | 三级黄色理论片 | 国产一区免费 | 国产日韩在线观看一区 | 久精品视频在线观看 | 人人干人人添 | 日韩中文在线字幕 | 亚洲精品一区二区精华 | 99久久日韩精品视频免费在线观看 | www.狠狠干| 国产乱老熟视频网88av | 精品视频在线视频 | 精品国产一区二区三区日日嗨 | 欧美人zozo| 免费看三级黄色片 | 深夜免费小视频 | 99re亚洲国产精品 | 欧美精品久久久 | 日韩精品中文字幕在线播放 | 91污污| 中文字幕亚洲欧美日韩 | 日韩色区 | 久久av观看 | 日韩精品在线观看av | 成人免费视频观看 | 久久久受www免费人成 | 亚洲艳情| 国语久久| 成人黄色片免费 | 视频成人| 日韩欧美黄色网址 | 久久视频免费观看 | 欧美激情精品久久久久久变态 | av一区在线 | 国产日韩三级 | 国产精品麻豆果冻传媒在线播放 | 国产高清不卡av | 久久久久久综合网天天 | 久久不射影院 | 99视频国产精品免费观看 | 久久手机免费视频 | 一区二区久久 | 91漂亮少妇露脸在线播放 | 国产高h视频 | 国产成人一区二区三区在线观看 | 日本久久不卡视频 | 亚洲欧美视频一区二区三区 | 免费在线一区二区 | 色干干 | 精品国产一二区 | 综合久久影院 | av日韩中文| 天天爽天天搞 | 五月婷婷激情网 | 九九久久久久久久久激情 | 操操操操网 | 免费在线播放视频 | 国产一级高清视频 | 日韩激情精品 | 一区二区精 | 亚洲午夜精品久久久久久久久 | 国产成人一级电影 | 欧美日韩一级久久久久久免费看 | 精品国产片 | 麻豆系列在线观看 | 久久精品亚洲国产 | 国产精品永久在线观看 | 免费看三级 | 精品九九九九 | 人人插人人搞 | 精品国产伦一区二区三区观看体验 | 欧美另类xxx | 91精品国产一区二区在线观看 | 99热精品久久 | 成人xxxx | 国产91丝袜在线播放动漫 | 丁香六月激情 | 免费男女羞羞的视频网站中文字幕 | 狠狠综合久久av | 国产999精品久久久久久 | 免费看色的网站 | 久久久久久久精 | 国产专区视频 | 高清av免费一区中文字幕 | 亚洲日日夜夜 | 国产精品k频道 | 亚洲永久字幕 | 久草网在线观看 | 成人国产精品免费 | 免费看国产曰批40分钟 | 99久久99 | 国产一区私人高清影院 | 成人亚洲免费 | 久久久www成人免费毛片 | 亚州国产视频 | 狠狠色丁婷婷日日 | 精品免费久久 | 色福利网 | 成人午夜电影在线 | av一级在线观看 | 亚洲精品国产拍在线 | ww亚洲ww亚在线观看 | 国产第一二区 | 成人精品999 | 99精品国自产在线 | 最新日韩中文字幕 | 欧美国产日韩在线观看 | 国产中文字幕在线观看 | 天天爽天天爽天天爽 | 日韩电影中文,亚洲精品乱码 | 在线观看成人 | 操操操人人 | 日本h在线播放 | 久久桃花网| 成年人免费电影 | 嫩嫩影院理论片 | 91精品国产综合久久福利 | 国产精品区一区 | 在线亚洲人成电影网站色www | 91大神在线看 | 正在播放国产一区二区 | 在线视频福利 | 亚洲美女在线国产 | 99婷婷 | 中文字幕乱码一区二区 | 免费网站色 | 香蕉色综合 | 久精品视频在线 | 天天操网站 | 国产精品区二区三区日本 | 久久99久久久久久 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 激情综合啪啪 | 亚洲精区二区三区四区麻豆 | 日韩一区二区三区在线看 | 欧美精品免费在线观看 | 涩涩在线| japanese黑人亚洲人4k | 波多野结衣视频一区 | 亚洲高清国产视频 | 国产在线看一区 | 国产精品国产精品 | 国产精品美女999 | 黄色av电影免费观看 | 国内99视频| 日日日操操 | 国产高清精品在线观看 | 婷婷在线观看视频 | 开心激情婷婷 | 最近中文字幕mv免费高清在线 | 天天激情天天干 | 中文伊人 | 久久综合久久综合这里只有精品 | 91精品国自产拍天天拍 | 99999精品视频 | 久久成电影 | 成年人av在线播放 | 粉嫩av一区二区三区四区五区 | 色欧美日韩 | 久久久免费看视频 | 成人三级网站在线观看 | 国产精品成人自拍 | 日韩一二三在线 | 国产视频网站在线观看 | 久99久在线视频 | 中文字幕一区二区三区久久 | 欧美色插 | 深爱婷婷网| 日本成人免费在线观看 | 中字幕视频在线永久在线观看免费 | 人人爽人人爽人人爽 | 91精品国产91久久久久福利 | 在线观看视频你懂得 | 成人黄色电影在线观看 | 日韩成人av在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 色婷婷成人网 | 亚洲精品国产自产拍在线观看 | 99精品区| 999久久久久久久久6666 | 超碰在线观看av | 久综合网 | 一区二区三区免费在线 | 九九99视频| 在线国产专区 | 精品在线一区二区 | 亚洲国产精品久久久久久 | 成片免费观看视频大全 | 66av99精品福利视频在线 | 高清av免费观看 | 成人免费看电影 | 欧美色操| 国产精品成人免费精品自在线观看 | 欧美巨乳网| 国产色黄网站 | 狠狠干中文字幕 | 黄色大全视频 | 99久久精品无码一区二区毛片 | 中文av不卡 | 日狠狠| 99久久99久久精品国产片 | 亚洲精品国产精品国自 | 久久午夜免费观看 | 久久精品久久精品久久 | 蜜臀久久99精品久久久久久网站 | 久久艹在线观看 | 中文字幕在线视频一区 | 成人av高清| 国产免费人成xvideos视频 | 蜜桃av综合网 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产成人精品在线观看 | 911免费视频 | 国产日韩在线视频 | 色婷婷五 | 天天想夜夜操 | 天堂av免费看 | 91粉色视频| av中文字幕日韩 | 日韩高清在线看 | 久久国产精品一二三区 | 99超碰在线观看 | 日本特黄一级片 | 91精品国产91p65| 欧美日韩午夜 | 亚洲精品视频在线观看免费视频 | 黄色日视频 | 亚洲国产成人精品在线观看 | av短片在线| 特黄一级毛片 | 日本激情动作片免费看 | 激情小说久久 | 五月天久久综合网 | 麻豆国产在线播放 | 蜜桃av人人夜夜澡人人爽 | 人人爽人人爽人人爽人人爽 | 欧美日高清视频 | 国产成人久久久77777 | www黄色 | 国产精品日韩欧美一区二区 | 在线黄色av电影 | 亚洲精品视频免费在线 | 日韩在线欧美在线 | 蜜臀aⅴ国产精品久久久国产 | 天天干,天天插 | 国内99视频 | 久久se视频| 99久热在线精品视频观看 | 国产精品久久久久久久久久三级 | 女人18片毛片90分钟 | 国产精品视频内 | 精品av在线播放 | 麻豆精品视频在线观看免费 | av中文在线观看 | 久久福利在线 | 亚洲国产成人精品在线观看 | 婷婷六月天在线 | 欧美日韩国产一区 | 蜜臀av网址 | 成人在线播放av | 日日夜夜天天干 | 夜色在线资源 | 福利视频在线看 | 久久噜噜少妇网站 | 久久久精品国产一区二区 | 免费观看完整版无人区 | 久久成人免费电影 | 久久精品国产精品亚洲 | 天天撸夜夜操 | 500部大龄熟乱视频使用方法 | 中文字幕在线观看国产 | 一区二区三区四区免费视频 | 欧美另类高潮 | 久久人人爽人人片 | 欧美资源 | 色偷偷中文字幕 | 在线观看小视频 | 精品黄色在线 | 999久久久免费精品国产 | 色综合天天色 | 天堂网一区 | 国产免费一区二区三区网站免费 | 狠狠躁夜夜a产精品视频 | 亚洲黄色在线观看 | mm1313亚洲精品国产 | 91精品国产福利在线观看 | 视频成人永久免费视频 | 国产中文 | 久久综合久久综合这里只有精品 | 500部大龄熟乱视频 欧美日本三级 | 69久久99精品久久久久婷婷 | 国产午夜精品免费一区二区三区视频 | 欧美日韩在线免费观看 | 在线观看国产区 | 欧美视频二区 | 国产视频一区二区在线播放 | 夜夜躁狠狠躁日日躁 | 波多野结衣一区二区三区中文字幕 | 超碰在线9 | 中国精品一区二区 | 亚洲黄色免费 | 国产成人三级一区二区在线观看一 | 国产精品国产亚洲精品看不卡 | 亚洲美女精品区人人人人 | 国产精在线 | 国产精品一区二区无线 | 久久夜色网 | 特黄色大片 | 欧美日韩裸体免费视频 | 99热精品视| 99热这里精品 | av+在线播放在线播放 | 精品女同一区二区三区在线观看 | 亚洲精色| 狂野欧美激情性xxxx欧美 | 国产精品成人a免费观看 | 正在播放国产91 | 久久成人国产 | 免费合欢视频成人app | 久久久夜色| 日韩xxxxxxxxx | 亚洲精品久久久久中文字幕二区 | 夜夜操天天干 | 亚洲一片黄 | 深夜免费小视频 | 国产成人精品aaa | 久久五月天婷婷 | 色偷偷人人澡久久超碰69 | 午夜精品电影一区二区在线 | av中文字幕网站 | 国产成人精品亚洲 | 午夜精品久久久久99热app | 中文字幕视频观看 | 一级成人网| 国内久久久久 | 91色在线观看视频 | 国产福利在线免费观看 | 久久久国产精品一区二区中文 | 制服丝袜成人在线 | 亚洲黄色成人 | 日精品| 狠狠干夜夜操 | 国产剧情久久 | 亚洲1区 在线 | 99福利片 | 色综合久久精品 |