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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

matchers依赖_Hamcrest Matchers,Guava谓词和Builder设计模式

發布時間:2023/12/3 asp.net 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 matchers依赖_Hamcrest Matchers,Guava谓词和Builder设计模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

matchers依賴

通常,在編碼時,我們必須處理其中包含數十個字段的一些POJO對象。 很多時候,我們通過一個帶有數十個參數的構造函數來初始化這些類,這以任何可能的想象的方式都是可怕的。 除此之外,使用這些構造函數的函數幾乎不可測試。 讓我們仔細看看如何使用Builder來改變這種情況,并與Hamcrest匹配器和Guava謂詞一起對其進行單元測試。 讓我們開始看一下POJO類。

SomeBigPojo.java

package pl.grzejszczak.marcin.junit.matchers.pojo;/*** Created with IntelliJ IDEA.* User: mgrzejszczak* Date: 03.01.13* Time: 21:05*/ public class SomeBigPojo {private String stringField0;private Integer integerField0;private Boolean booleanField0;private String stringField1;private Integer integerField1;private Boolean booleanField1;private String stringField2;private Integer integerField2;private Boolean booleanField2;private String stringField3;private Integer integerField3;private Boolean booleanField3;private String stringField4;private Integer integerField4;private Boolean booleanField4;private String stringField5;private Integer integerField5;private Boolean booleanField5;private String stringField6;private Integer integerField6;private Boolean booleanField6;private String stringField7;private String stringField8;private String stringField9;public SomeBigPojo(String stringField0, Integer integerField0, Boolean booleanField0, String stringField1, Integer integerField1, Boolean booleanField1, String stringField2, Integer integerField2, Boolean booleanField2, String stringField3, Integer integerField3, Boolean booleanField3, String stringField4, Integer integerField4, Boolean booleanField4, String stringField5, Integer integerField5, Boolean booleanField5, String stringField6, Integer integerField6, Boolean booleanField6, String stringField7, String stringField8, String stringField9) {this.stringField0 = stringField0;this.integerField0 = integerField0;this.booleanField0 = booleanField0;this.stringField1 = stringField1;this.integerField1 = integerField1;this.booleanField1 = booleanField1;this.stringField2 = stringField2;this.integerField2 = integerField2;this.booleanField2 = booleanField2;this.stringField3 = stringField3;this.integerField3 = integerField3;this.booleanField3 = booleanField3;this.stringField4 = stringField4;this.integerField4 = integerField4;this.booleanField4 = booleanField4;this.stringField5 = stringField5;this.integerField5 = integerField5;this.booleanField5 = booleanField5;this.stringField6 = stringField6;this.integerField6 = integerField6;this.booleanField6 = booleanField6;this.stringField7 = stringField7;this.stringField8 = stringField8;this.stringField9 = stringField9;}public String getStringField0() {return stringField0;}public void setStringField0(String stringField0) {this.stringField0 = stringField0;}public Integer getIntegerField0() {return integerField0;}public void setIntegerField0(Integer integerField0) {this.integerField0 = integerField0;}public Boolean getBooleanField0() {return booleanField0;}public void setBooleanField0(Boolean booleanField0) {this.booleanField0 = booleanField0;}public String getStringField1() {return stringField1;}public void setStringField1(String stringField1) {this.stringField1 = stringField1;}public Integer getIntegerField1() {return integerField1;}public void setIntegerField1(Integer integerField1) {this.integerField1 = integerField1;}public Boolean getBooleanField1() {return booleanField1;}public void setBooleanField1(Boolean booleanField1) {this.booleanField1 = booleanField1;}public String getStringField2() {return stringField2;}public void setStringField2(String stringField2) {this.stringField2 = stringField2;}public Integer getIntegerField2() {return integerField2;}public void setIntegerField2(Integer integerField2) {this.integerField2 = integerField2;}public Boolean getBooleanField2() {return booleanField2;}public void setBooleanField2(Boolean booleanField2) {this.booleanField2 = booleanField2;}public String getStringField3() {return stringField3;}public void setStringField3(String stringField3) {this.stringField3 = stringField3;}public Integer getIntegerField3() {return integerField3;}public void setIntegerField3(Integer integerField3) {this.integerField3 = integerField3;}public Boolean getBooleanField3() {return booleanField3;}public void setBooleanField3(Boolean booleanField3) {this.booleanField3 = booleanField3;}public String getStringField4() {return stringField4;}public void setStringField4(String stringField4) {this.stringField4 = stringField4;}public Integer getIntegerField4() {return integerField4;}public void setIntegerField4(Integer integerField4) {this.integerField4 = integerField4;}public Boolean getBooleanField4() {return booleanField4;}public void setBooleanField4(Boolean booleanField4) {this.booleanField4 = booleanField4;}public String getStringField5() {return stringField5;}public void setStringField5(String stringField5) {this.stringField5 = stringField5;}public Integer getIntegerField5() {return integerField5;}public void setIntegerField5(Integer integerField5) {this.integerField5 = integerField5;}public Boolean getBooleanField5() {return booleanField5;}public void setBooleanField5(Boolean booleanField5) {this.booleanField5 = booleanField5;}public String getStringField6() {return stringField6;}public void setStringField6(String stringField6) {this.stringField6 = stringField6;}public Integer getIntegerField6() {return integerField6;}public void setIntegerField6(Integer integerField6) {this.integerField6 = integerField6;}public Boolean getBooleanField6() {return booleanField6;}public void setBooleanField6(Boolean booleanField6) {this.booleanField6 = booleanField6;}public String getStringField7() {return stringField7;}public void setStringField7(String stringField7) {this.stringField7 = stringField7;}public String getStringField8() {return stringField8;}public void setStringField8(String stringField8) {this.stringField8 = stringField8;}public String getStringField9() {return stringField9;}public void setStringField9(String stringField9) {this.stringField9 = stringField9;}@Overridepublic String toString() {final StringBuilder sb = new StringBuilder();sb.append("SomeBigPojo");sb.append("{stringField0='").append(stringField0).append('\'');sb.append(", integerField0=").append(integerField0);sb.append(", booleanField0=").append(booleanField0);sb.append(", stringField1='").append(stringField1).append('\'');sb.append(", integerField1=").append(integerField1);sb.append(", booleanField1=").append(booleanField1);sb.append(", stringField2='").append(stringField2).append('\'');sb.append(", integerField2=").append(integerField2);sb.append(", booleanField2=").append(booleanField2);sb.append(", stringField3='").append(stringField3).append('\'');sb.append(", integerField3=").append(integerField3);sb.append(", booleanField3=").append(booleanField3);sb.append(", stringField4='").append(stringField4).append('\'');sb.append(", integerField4=").append(integerField4);sb.append(", booleanField4=").append(booleanField4);sb.append(", stringField5='").append(stringField5).append('\'');sb.append(", integerField5=").append(integerField5);sb.append(", booleanField5=").append(booleanField5);sb.append(", stringField6='").append(stringField6).append('\'');sb.append(", integerField6=").append(integerField6);sb.append(", booleanField6=").append(booleanField6);sb.append(", stringField7='").append(stringField7).append('\'');sb.append(", stringField8='").append(stringField8).append('\'');sb.append(", stringField9='").append(stringField9).append('\'');sb.append('}');return sb.toString();} }

現在看一下為了擺脫龐大的構造函數的使用而使用的builder類。 而且,您可以設置任何所需的內容,而無需為不需要的字段輸入null。

SomeBigPojoBuilder.java

package pl.grzejszczak.marcin.junit.matchers.builder;import pl.grzejszczak.marcin.junit.matchers.pojo.SomeBigPojo;import static com.google.common.base.Preconditions.checkNotNull;/*** Created with IntelliJ IDEA.* User: mgrzejszczak* Date: 03.01.13* Time: 21:08*/ public class SomeBigPojoBuilder {/** A field with some default value */private String stringField0 = "defaultValueForString0";/** A field with some default value */private Integer integerField0 = 100;/** A field with some default value */private Boolean booleanField0 = true;private String stringField1;private Integer integerField1;private Boolean booleanField1;private String stringField2;private Integer integerField2;private Boolean booleanField2;private String stringField3;private Integer integerField3;private Boolean booleanField3;private String stringField4;private Integer integerField4;private Boolean booleanField4;private String stringField5;private Integer integerField5;private Boolean booleanField5;private String stringField6;private Integer integerField6;private Boolean booleanField6;private String stringField7;private String stringField8;private String stringField9;public SomeBigPojoBuilder setStringField0(String stringField0) {this.stringField0 = stringField0;return this;}public SomeBigPojoBuilder setIntegerField0(Integer integerField0) {this.integerField0 = integerField0;return this;}public SomeBigPojoBuilder setBooleanField0(Boolean booleanField0) {this.booleanField0 = booleanField0;return this;}public SomeBigPojoBuilder setStringField1(String stringField1) {this.stringField1 = stringField1;return this;}public SomeBigPojoBuilder setIntegerField1(Integer integerField1) {this.integerField1 = integerField1;return this;}public SomeBigPojoBuilder setBooleanField1(Boolean booleanField1) {this.booleanField1 = booleanField1;return this;}public SomeBigPojoBuilder setStringField2(String stringField2) {this.stringField2 = stringField2;return this;}public SomeBigPojoBuilder setIntegerField2(Integer integerField2) {this.integerField2 = integerField2;return this;}public SomeBigPojoBuilder setBooleanField2(Boolean booleanField2) {this.booleanField2 = booleanField2;return this;}public SomeBigPojoBuilder setStringField3(String stringField3) {this.stringField3 = stringField3;return this;}public SomeBigPojoBuilder setIntegerField3(Integer integerField3) {this.integerField3 = integerField3;return this;}public SomeBigPojoBuilder setBooleanField3(Boolean booleanField3) {this.booleanField3 = booleanField3;return this;}public SomeBigPojoBuilder setStringField4(String stringField4) {this.stringField4 = stringField4;return this;}public SomeBigPojoBuilder setIntegerField4(Integer integerField4) {this.integerField4 = integerField4;return this;}public SomeBigPojoBuilder setBooleanField4(Boolean booleanField4) {this.booleanField4 = booleanField4;return this;}public SomeBigPojoBuilder setStringField5(String stringField5) {this.stringField5 = stringField5;return this;}public SomeBigPojoBuilder setIntegerField5(Integer integerField5) {this.integerField5 = integerField5;return this;}public SomeBigPojoBuilder setBooleanField5(Boolean booleanField5) {this.booleanField5 = booleanField5;return this;}public SomeBigPojoBuilder setStringField6(String stringField6) {this.stringField6 = stringField6;return this;}public SomeBigPojoBuilder setIntegerField6(Integer integerField6) {this.integerField6 = integerField6;return this;}public SomeBigPojoBuilder setBooleanField6(Boolean booleanField6) {this.booleanField6 = booleanField6;return this;}public SomeBigPojoBuilder setStringField7(String stringField7) {this.stringField7 = stringField7;return this;}public SomeBigPojoBuilder setStringField8(String stringField8) {this.stringField8 = stringField8;return this;}public SomeBigPojoBuilder setStringField9(String stringField9) {this.stringField9 = stringField9;return this;}/*** Some function checking the state of our POJO*/private void checkState(){checkNotNull(stringField1, "StringField1 must not be null!");}public SomeBigPojo createSomeBigPojoWithBuilder() {checkState();return new SomeBigPojo(stringField0, integerField0, booleanField0, stringField1, integerField1, booleanField1, stringField2, integerField2, booleanField2, stringField3, integerField3, booleanField3, stringField4, integerField4, booleanField4, stringField5, integerField5, booleanField5, stringField6, integerField6, booleanField6, stringField7, stringField8, stringField9);} }

看一下checkState函數,該函數驗證對象是否處于所需狀態。 這樣,如果某些條件不完整,我們可能不允許創建對象。 對于這種情況,我們使用番石榴的謂詞– checkNotNull方法。

請注意,Builder模式背后的概念是將對象的創建委托給Builder。 實際上,在純Builder設計模式實現中,我們將必須具有Director,對Builder的一些抽象以及這樣的Builder的具體實現。 在我們的例子中,我們簡化了這種模式–我使用了IntelliJ的重構選項。 要使它看起來更好,可以做的是從POJO中刪除構造函數,并僅通過setter傳遞值(這實際上是我在我的一個項目中所做的事情)。 現在讓我們看一些用法示例:

SomeServiceImpl.java

package pl.grzejszczak.marcin.junit.matchers.service;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import pl.grzejszczak.marcin.junit.matchers.builder.SomeBigPojoBuilder; import pl.grzejszczak.marcin.junit.matchers.pojo.SomeBigPojo;import static java.lang.String.format;/*** Created with IntelliJ IDEA.* User: mgrzejszczak* Date: 03.01.13* Time: 21:25*/ public class SomeServiceImpl implements SomeService {private static final Logger LOGGER = LoggerFactory.getLogger(SomeServiceImpl.class);/** Could be an abstraction of builders injected by a setter - possible to mock */private SomeBigPojoBuilder someBigPojoBuilder;/*** Hard to unit test*/@Overridepublic void someLogicForAPojoWithoutBuilder() {LOGGER.debug("SomeLogicForAPojoWithoutBuilder executed");SomeBigPojo someBigPojo = new SomeBigPojo("string", 1, false, "other string", 123, true, "something else", 321, false, "yet another string", 111, true, "something", 2, false, "More", 3, true, "String", 12, false, "some", "value", "ofString");// Any chance of knowing what is the value of stringField8 basing on the constructor?LOGGER.debug(format("StringField8 is equal [%s]%n", someBigPojo.getStringField8()));// Print the objectLOGGER.debug(someBigPojo.toString());}@Overridepublic void someLogicForAPojoWithBuilder() {LOGGER.debug("SomeLogicForAPojoWithBuilder executed");SomeBigPojo someBigPojo = someBigPojoBuilder.setStringField0("string").setIntegerField0(1).setBooleanField0(false).setStringField1("other string").setIntegerField1(123).setBooleanField1(true).setStringField2("something else").setIntegerField2(321).setBooleanField2(false).setStringField3("yet another string").setIntegerField3(111).setBooleanField3(false).setStringField4("something").setIntegerField4(2).setBooleanField4(false).setStringField5("More").setIntegerField5(3).setBooleanField5(true).setStringField6("String").setIntegerField6(12).setBooleanField6(false).setStringField7("some").setStringField8("value").setStringField9("ofString").createSomeBigPojoWithBuilder();// Looking at the builder now I guess it's obvious what the value of StringField8LOGGER.debug(format("StringField8 is equal [%s]%n", someBigPojo.getStringField8()));// Print the objectLOGGER.debug(someBigPojo.toString());}@Overridepublic void someLogicForAPojoWithBuilderBadArgument() {LOGGER.debug("someLogicForAPojoWithBuilderBadArgument executed");SomeBigPojo someBigPojo = someBigPojoBuilder.setStringField0("string").setIntegerField0(1).setBooleanField0(true).setIntegerField1(123).setBooleanField1(true).setStringField2("something else").setIntegerField2(321).setBooleanField2(false).setStringField3("yet another string").setIntegerField3(111).setBooleanField3(false).setStringField4("something").setIntegerField4(2).setBooleanField4(false).setStringField5("More").setIntegerField5(3).setBooleanField5(true).setStringField6("String").setIntegerField6(12).setBooleanField6(false).setStringField7("some").setStringField8("value").setStringField9("ofString").createSomeBigPojoWithBuilder();// Print the object - will we even see an outputLOGGER.debug(someBigPojo.toString());}public void setSomeBigPojoBuilder(SomeBigPojoBuilder someBigPojoBuilder) {this.someBigPojoBuilder = someBigPojoBuilder;} }

請注意,現在創建對象非常清楚,定義一個字段是否已設置也很容易。

讓我們繼續進行Hamcrest匹配器,這將幫助我們對班級進行單元測試。 我不會嘗試完成100%的完整代碼覆蓋-這篇文章的目的是展示Hamcrest Matchers如何成為您的單元測試的補充。 通常,單元測試還不清楚,看起來像這樣:

SomeBigPojoBuilderNoMatchersAndNoRefactoringTest.java

package pl.grzejszczak.marcin.junit.matchers.builder;import org.junit.Before; import org.junit.Test; import pl.grzejszczak.marcin.junit.matchers.pojo.SomeBigPojo;import static junit.framework.Assert.assertTrue; import static org.apache.commons.lang.StringUtils.isNumeric; import static pl.grzejszczak.marcin.junit.matchers.pojo.SomePojoConstants.*;/*** Created with IntelliJ IDEA.* User: mgrzejszczak* Date: 03.01.13* Time: 23:02*/ public class SomeBigPojoBuilderNoMatchersAndNoRefactoringTest {private SomeBigPojoBuilder objectUnderTest;@Beforepublic void setUp() {objectUnderTest = new SomeBigPojoBuilder();}@Testpublic void testCreateSomeBigPojoWithBuilder() throws Exception {SomeBigPojo someBigPojo = objectUnderTest.setBooleanField1(true).setStringField0("1").setStringField1("12").setStringField2("123").setStringField3("1234").setStringField4("12345").setStringField5("123456").setStringField6("1234567").setStringField7("12345678").setStringField8("123456789").setStringField9("1234567890").createSomeBigPojoWithBuilder();isPojoProperlyBuilt(someBigPojo);}@Test(expected = AssertionError.class)public void testCreateSomeBigPojoWithBuilderWrongFields() throws Exception {SomeBigPojo someBigPojo = objectUnderTest.setStringField0("0").setStringField1("Too long").createSomeBigPojoWithBuilder();isPojoProperlyBuilt(someBigPojo);}private void isPojoProperlyBuilt(SomeBigPojo someBigPojo) {assertTrue(someBigPojo.getStringField0().length() == STRING_FIELD_0_LENGTH);assertTrue(isNumeric(someBigPojo.getStringField0()));assertTrue(someBigPojo.getStringField1().length() == STRING_FIELD_1_LENGTH);assertTrue(isNumeric(someBigPojo.getStringField0()));assertTrue(someBigPojo.getStringField2().length() == STRING_FIELD_2_LENGTH);assertTrue(isNumeric(someBigPojo.getStringField0()));assertTrue(someBigPojo.getStringField3().length() == STRING_FIELD_3_LENGTH);assertTrue(isNumeric(someBigPojo.getStringField0()));assertTrue(someBigPojo.getStringField4().length() == STRING_FIELD_4_LENGTH);assertTrue(isNumeric(someBigPojo.getStringField0()));assertTrue(someBigPojo.getStringField5().length() == STRING_FIELD_5_LENGTH);assertTrue(someBigPojo.getStringField6().length() == STRING_FIELD_6_LENGTH);assertTrue(someBigPojo.getStringField7().length() == STRING_FIELD_7_LENGTH);assertTrue(someBigPojo.getStringField8().length() == STRING_FIELD_8_LENGTH);assertTrue(someBigPojo.getStringField9().length() == STRING_FIELD_9_LENGTH);} }

簡單的重構可以使它們看起來更好……

SomeBigPojoBuilderNoMatchersTest.java

package pl.grzejszczak.marcin.junit.matchers.builder;import org.junit.Before; import org.junit.Test; import pl.grzejszczak.marcin.junit.matchers.pojo.SomeBigPojo;import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; import static org.apache.commons.lang.StringUtils.isNumeric; import static pl.grzejszczak.marcin.junit.matchers.pojo.SomePojoConstants.*;/*** Created with IntelliJ IDEA.* User: mgrzejszczak* Date: 03.01.13* Time: 23:02*/ public class SomeBigPojoBuilderNoMatchersTest {private SomeBigPojoBuilder objectUnderTest;@Beforepublic void setUp() {objectUnderTest = new SomeBigPojoBuilder();}@Testpublic void testCreateSomeBigPojoWithBuilder() throws Exception {SomeBigPojo someBigPojo = objectUnderTest.setBooleanField1(true).setStringField0("1").setStringField1("12").setStringField2("123").setStringField3("1234").setStringField4("12345").setStringField5("123456").setStringField6("1234567").setStringField7("12345678").setStringField8("123456789").setStringField9("1234567890").createSomeBigPojoWithBuilder();isPojoProperlyBuilt(someBigPojo);}@Test(expected = AssertionError.class)public void testCreateSomeBigPojoWithBuilderWrongFields() throws Exception {SomeBigPojo someBigPojo = objectUnderTest.setStringField0("0").setStringField1("too long").createSomeBigPojoWithBuilder();isPojoProperlyBuilt(someBigPojo);}private void isPojoProperlyBuilt(SomeBigPojo someBigPojo) {isOfGivenLength(someBigPojo.getStringField0(), STRING_FIELD_0_LENGTH);isFieldOfNumericValue(someBigPojo.getStringField0());isOfGivenLength(someBigPojo.getStringField1(), STRING_FIELD_1_LENGTH);isFieldOfNumericValue(someBigPojo.getStringField0());isOfGivenLength(someBigPojo.getStringField2(), STRING_FIELD_2_LENGTH);isFieldOfNumericValue(someBigPojo.getStringField0());isOfGivenLength(someBigPojo.getStringField3(), STRING_FIELD_3_LENGTH);isFieldOfNumericValue(someBigPojo.getStringField0());isOfGivenLength(someBigPojo.getStringField4(), STRING_FIELD_4_LENGTH);isFieldOfNumericValue(someBigPojo.getStringField0());isOfGivenLength(someBigPojo.getStringField5(), STRING_FIELD_5_LENGTH);isOfGivenLength(someBigPojo.getStringField6(), STRING_FIELD_6_LENGTH);isOfGivenLength(someBigPojo.getStringField7(), STRING_FIELD_7_LENGTH);isOfGivenLength(someBigPojo.getStringField8(), STRING_FIELD_8_LENGTH);isOfGivenLength(someBigPojo.getStringField9(), STRING_FIELD_9_LENGTH);}private void isOfGivenLength(String pojo, final Integer expectedLength) {assertNotNull(pojo);assertTrue(expectedLength == pojo.length());}private void isFieldOfNumericValue(String field) {assertTrue(isNumeric(field));} }

看起來不錯,不是嗎? 以及使用Matchers代替函數呢?

SomeBigPojoBuilderTest.kava

package pl.grzejszczak.marcin.junit.matchers.builder;import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.hamcrest.Matcher; import org.junit.Before; import org.junit.Test; import pl.grzejszczak.marcin.junit.matchers.pojo.SomeBigPojo;import static java.lang.String.format; import static junit.framework.Assert.assertTrue; import static org.apache.commons.lang.StringUtils.isNumeric; import static org.junit.Assert.assertThat; import static pl.grzejszczak.marcin.junit.matchers.pojo.SomePojoConstants.*;/*** Created with IntelliJ IDEA.* User: mgrzejszczak* Date: 03.01.13* Time: 23:02*/ public class SomeBigPojoBuilderTest {private SomeBigPojoBuilder objectUnderTest;@Beforepublic void setUp(){objectUnderTest = new SomeBigPojoBuilder();}@Testpublic void testCreateSomeBigPojoWithBuilder() throws Exception {SomeBigPojo someBigPojo = objectUnderTest.setBooleanField1(true).setStringField0("1").setStringField1("12").setStringField2("123").setStringField3("1234").setStringField4("12345").setStringField5("123456").setStringField6("1234567").setStringField7("12345678").setStringField8("123456789").setStringField9("1234567890").createSomeBigPojoWithBuilder();assertThat(someBigPojo, isPojoProperlyBuilt());}@Test(expected = AssertionError.class)public void testCreateSomeBigPojoWithBuilderWrongFields() throws Exception {SomeBigPojo someBigPojo = objectUnderTest.setStringField0("0").setStringField1("Too long").createSomeBigPojoWithBuilder();assertThat(someBigPojo, isPojoProperlyBuilt());}/*** Let us assume that there is a specific business case that we have to take into consideration regarding some particular field** @return*/private static Matcher isPojoProperlyBuilt() {return new BaseMatcher() {@Overridepublic boolean matches(Object o) {assertTrue(o instanceof SomeBigPojo);SomeBigPojo someBigPojo = (SomeBigPojo) o;assertThat(someBigPojo.getStringField0(), isOfGivenLength(STRING_FIELD_0_LENGTH));assertThat(someBigPojo.getStringField0(), isFieldOfNumericValue());assertThat(someBigPojo.getStringField1(), isOfGivenLength(STRING_FIELD_1_LENGTH));assertThat(someBigPojo.getStringField1(), isFieldOfNumericValue());assertThat(someBigPojo.getStringField2(), isOfGivenLength(STRING_FIELD_2_LENGTH));assertThat(someBigPojo.getStringField2(), isFieldOfNumericValue());assertThat(someBigPojo.getStringField3(), isOfGivenLength(STRING_FIELD_3_LENGTH));assertThat(someBigPojo.getStringField3(), isFieldOfNumericValue());assertThat(someBigPojo.getStringField4(), isOfGivenLength(STRING_FIELD_4_LENGTH));assertThat(someBigPojo.getStringField4(), isFieldOfNumericValue());assertThat(someBigPojo.getStringField5(), isOfGivenLength(STRING_FIELD_5_LENGTH));assertThat(someBigPojo.getStringField6(), isOfGivenLength(STRING_FIELD_6_LENGTH));assertThat(someBigPojo.getStringField7(), isOfGivenLength(STRING_FIELD_7_LENGTH));assertThat(someBigPojo.getStringField8(), isOfGivenLength(STRING_FIELD_8_LENGTH));assertThat(someBigPojo.getStringField9(), isOfGivenLength(STRING_FIELD_9_LENGTH));return true;}@Overridepublic void describeTo(Description description) {description.appendText("Lengths of fields are limited and the first 4 fields are numeric");}};}private static Matcher isOfGivenLength(final Integer expectedLength) {return new BaseMatcher() {public boolean matches(Object o) {assertTrue(o instanceof String);return expectedLength == String.valueOf(o).length();}public void describeTo(Description description) {description.appendText(format("String's length should be equal to [%d]", expectedLength));}};}private static Matcher isFieldOfNumericValue() {return new BaseMatcher() {public boolean matches(Object o) {assertTrue(o instanceof String);return isNumeric(String.valueOf(o));}public void describeTo(Description description) {description.appendText("The value of the field should be numeric");}};} }

以下主要方法執行服務的功能:

package pl.grzejszczak.marcin.junit.matchers;import pl.grzejszczak.marcin.junit.matchers.builder.SomeBigPojoBuilder; import pl.grzejszczak.marcin.junit.matchers.service.SomeServiceImpl;/*** Created with IntelliJ IDEA.* User: mgrzejszczak* Date: 03.01.13* Time: 22:38*/ public class MatcherMain {public static void main(String[] args){SomeServiceImpl someService = new SomeServiceImpl();someService.setSomeBigPojoBuilder(new SomeBigPojoBuilder());someService.someLogicForAPojoWithoutBuilder();someService.setSomeBigPojoBuilder(new SomeBigPojoBuilder());someService.someLogicForAPojoWithBuilder();someService.setSomeBigPojoBuilder(new SomeBigPojoBuilder());someService.someLogicForAPojoWithBuilderBadArgument();} }

日志是:

pl.grzejszczak.marcin.junit.matchers.service.SomeServiceImpl:27 SomeLogicForAPojoWithoutBuilder executed pl.grzejszczak.marcin.junit.matchers.service.SomeServiceImpl:30 StringField8 is equal [value]pl.grzejszczak.marcin.junit.matchers.service.SomeServiceImpl:32 SomeBigPojo{stringField0='string', integerField0=1, booleanField0=false, stringField1='other string', integerField1=123, booleanField1=true, stringField2='something else', integerField2=321, booleanField2=false, stringField3='yet another string', integerField3=111, booleanField3=true, stringField4='something', integerField4=2, booleanField4=false, stringField5='More', integerField5=3, booleanField5=true, stringField6='String', integerField6=12, booleanField6=false, stringField7='some', stringField8='value', stringField9='ofString'} pl.grzejszczak.marcin.junit.matchers.service.SomeServiceImpl:37 SomeLogicForAPojoWithBuilder executed pl.grzejszczak.marcin.junit.matchers.service.SomeServiceImpl:65 StringField8 is equal [value]pl.grzejszczak.marcin.junit.matchers.service.SomeServiceImpl:67 SomeBigPojo{stringField0='string', integerField0=1, booleanField0=false, stringField1='other string', integerField1=123, booleanField1=true, stringField2='something else', integerField2=321, booleanField2=false, stringField3='yet another string', integerField3=111, booleanField3=false, stringField4='something', integerField4=2, booleanField4=false, stringField5='More', integerField5=3, booleanField5=true, stringField6='String', integerField6=12, booleanField6=false, stringField7='some', stringField8='value', stringField9='ofString'} pl.grzejszczak.marcin.junit.matchers.service.SomeServiceImpl:72 someLogicForAPojoWithBuilderBadArgument executed Exception in thread "main" java.lang.NullPointerException: StringField1 must not be null!at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:208)at pl.grzejszczak.marcin.junit.matchers.builder.SomeBigPojoBuilder.checkState(SomeBigPojoBuilder.java:166)at pl.grzejszczak.marcin.junit.matchers.builder.SomeBigPojoBuilder.createSomeBigPojoWithBuilder (SomeBigPojoBuilder.java:170)at pl.grzejszczak.marcin.junit.matchers.service.SomeServiceImpl.someLogicForAPojoWithBuilderBadArgument (SomeServiceImpl.java:73)at pl.grzejszczak.marcin.junit.matchers.MatcherMain.main(MatcherMain.java:23)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

我認為這看起來真的很好。 那你呢? 源代碼可在此處找到,代碼太多。

參考:來自我們的JCG合作伙伴 Marcin Grzejszczak的Hamcrest Matchers,Guava Predicate和Builder設計模式 ,該博客用于編碼成癮者博客。

翻譯自: https://www.javacodegeeks.com/2013/04/hamcrest-matchers-guava-predicate-and-builder-design-pattern.html

matchers依賴

總結

以上是生活随笔為你收集整理的matchers依赖_Hamcrest Matchers,Guava谓词和Builder设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。

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

中文字幕之中文字幕 | 天天亚洲| 狠狠干综合网 | 韩国av一区二区三区在线观看 | 久久免费看a级毛毛片 | 成人av在线一区二区 | 黄色在线看网站 | 99色视频 | 日韩精品欧美精品 | 欧洲亚洲激情 | 国产精品99精品久久免费 | 超碰在线cao| 在线中文字幕电影 | 2023av在线 | 欧洲精品久久久久毛片完整版 | 麻豆传媒一区二区 | 免费看黄色毛片 | 欧美爽爽爽 | 久久综合九色综合久99 | 天天草视频 | 午夜精品久久久久久久99无限制 | 婷婷新五月 | 国产精品粉嫩 | 免费看国产精品 | 天天摸日日操 | 日韩二区三区在线观看 | 久久免费成人网 | 日本天天操 | 91黄视频在线 | 国产一区欧美一区 | 91亚洲精品久久久蜜桃网站 | 中文字幕亚洲国产 | 在线观看视频黄色 | 久久全国免费视频 | 成人久久精品视频 | 国际精品久久 | 久久av网址 | 欧美一区三区四区 | 日日射av | 91九色porn在线资源 | 日韩动漫免费观看高清完整版在线观看 | 特级黄录像视频 | 亚洲最新av在线网址 | 国产小视频网站 | 四虎影视4hu4虎成人 | 国产黄色特级片 | 国产精品久久久毛片 | 99视频导航 | 九色琪琪久久综合网天天 | 97高清视频 | 国产99久久久国产精品成人免费 | 久久久国产精品网站 | 2019免费中文字幕 | 国产人在线成免费视频 | 国产中文字幕亚洲 | 久久99国产一区二区三区 | 国产精品久久久久久久久久久久午 | 国产精品九九视频 | 五月婷婷综合在线观看 | 亚洲天堂网在线观看视频 | 日本深夜福利视频 | 久草视频在线免费播放 | 一区二区三区日韩精品 | 91福利在线观看 | 国产精品美女久久久久久久久久久 | 免费看片成年人 | 亚洲涩涩涩 | 黄色三级久久 | 黄色资源网站 | 93久久精品日日躁夜夜躁欧美 | 婷婷综合亚洲 | 国内少妇自拍视频一区 | 精品9999 | 国产麻豆精品一区二区 | 亚洲欧美在线视频免费 | av在线影视 | 99国产一区二区三精品乱码 | 国产精品嫩草影院99网站 | 国产精品精品久久久 | 又爽又黄在线观看 | 欧美色888| 一区二区三区 亚洲 | 日韩在线电影 | 综合精品在线 | a天堂在线看 | 日韩免费一区二区三区 | 中文字幕免费观看全部电影 | 亚洲精品啊啊啊 | 91精品视频一区二区三区 | 午夜婷婷在线播放 | 亚洲干视频在线观看 | 成人在线网站观看 | 久久综合色天天久久综合图片 | 91在线免费视频 | 婷婷六月综合网 | 久久精品a | 在线观看亚洲成人 | 国产毛片在线 | 久久精品久久精品久久 | av中文资源在线 | 在线观看 国产 | 日韩免费视频观看 | 麻豆视频在线 | 91麻豆产精品久久久久久 | 午夜在线日韩 | 97av色 | 国产免费又粗又猛又爽 | 人人干在线 | 香蕉视频久久久 | 人人爽人人香蕉 | 亚洲九九精品 | 91精品国产麻豆国产自产影视 | 精品久久久国产 | 日韩在线观看av | 99热这里只有精品8 久久综合毛片 | 国产网红在线观看 | 狠狠色丁香婷婷综合 | 久久免费高清视频 | 中文字幕影视 | 久久黄色免费视频 | 福利精品在线 | 国产精品久久久久久爽爽爽 | 久久久亚洲国产精品麻豆综合天堂 | 欧美电影黄色 | 成人黄在线观看 | 在线韩国电影免费观影完整版 | 精品久久久久久久久久岛国gif | 五月天婷婷免费视频 | 国产精品国产精品 | 97国产在线视频 | 久久av中文字幕片 | 91精品国产九九九久久久亚洲 | 天天操天天是 | 天天射成人| 国产美女在线精品免费观看 | 久久免费久久 | 97超碰资源 | 一区 二区电影免费在线观看 | 国产精品青草综合久久久久99 | 五月视频 | 99久久久久久久久 | 97在线视频免费观看 | 免费看黄的视频 | 亚洲天天在线日亚洲洲精 | 免费视频黄色 | www.com黄色| 国产精品久久久久久久久毛片 | 99久久激情视频 | 麻豆成人小视频 | 韩日在线一区 | 成年人网站免费在线观看 | 成人毛片网 | a黄在线观看 | www激情com| 久久久久 | 欧美精品在线观看 | 国产精品永久免费视频 | 亚洲色视频 | 亚洲成人av片 | 天天操夜操 | 国产aaa毛片| 成人三级黄色 | 国产在线观看av | 亚洲精品一区二区三区新线路 | av+在线播放在线播放 | 中文字幕视频网站 | 欧美色插 | 欧美另类tv | 欧美福利网站 | 欧美老女人xx | 久久综合毛片 | 久久再线视频 | 九九热免费在线观看 | 久久人人爽av | 日本久久成人中文字幕电影 | 成年人看片网站 | 欧美大片www | 美女搞黄国产视频网站 | 婷婷av在线| 97自拍超碰 | 日韩欧美成| 91九色成人蝌蚪首页 | 日本不卡视频 | 五月天狠狠操 | 亚洲va欧美 | 女人魂免费观看 | 国产护士av| 91视频在线看 | 欧美激情操| 国产精品一区二区在线看 | 免费国产在线观看 | 久草在线手机观看 | 亚洲精品中文字幕在线观看 | 69久久久| 亚洲韩国一区二区三区 | 中文字幕 在线看 | 国产精品大尺度 | 天天干 天天摸 天天操 | 奇米网网址 | 精品国产中文字幕 | 天天看天天干 | 久久精品国产亚洲a | 久久久www成人免费毛片麻豆 | 天天爽天天摸 | 美女网色| 五月天天天操 | 91网站在线视频 | 安徽妇搡bbbb搡bbbb | 在线观看黄色av | 久久视频免费观看 | 日韩av不卡在线播放 | 久久97久久 | 亚洲丁香日韩 | 在线观看日韩中文字幕 | 国产精品在线看 | 免费看搞黄视频网站 | 国产裸体视频bbbbb | 久久久精品国产免费观看同学 | 91桃色在线观看视频 | 色天天中文| 啪啪激情网 | 免费在线91 | 亚洲视屏在线播放 | 国产精品青草综合久久久久99 | 久久久久国产一区二区三区四区 | 婷婷四房综合激情五月 | 午夜黄色一级片 | 99精品免费 | 亚洲日本国产精品 | 99热手机在线 | 国产综合91 | 欧美色就是色 | 国产91av视频在线观看 | 综合激情婷婷 | 色97在线 | 午夜视频欧美 | 69绿帽绿奴3pvideos | 成人一区在线观看 | 最近2019中文免费高清视频观看www99 | 久要激情网 | avsex| 久久成人毛片 | 一区二区在线影院 | 日韩欧美视频一区二区 | 久久久久久综合 | 久久国产高清视频 | 97操操| 在线精品视频免费播放 | 国产精品高 | 日韩高清黄色 | 91精品国产电影 | 在线看片a| 在线影院av | 最新一区二区三区 | 蜜桃视频成人在线观看 | 欧亚日韩精品一区二区在线 | 欧美一级久久久 | 激情五月婷婷激情 | 日韩免费一区二区三区 | 天天做天天干 | 亚洲最新在线 | 91视频久久久久 | www.五月婷婷 | 最新日本中文字幕 | www..com毛片 | 亚洲丝袜一区二区 | 免费性网站 | 日韩久久精品一区二区 | 精品欧美一区二区精品久久 | 狠狠干我 | 亚洲片在线资源 | 99精品视频网站 | 操操操com | 国产又粗又猛又色又黄视频 | 国产精品自产拍在线观看中文 | 特级西西444www大精品视频免费看 | 国产一区成人在线 | 国产亚洲精品免费 | 麻豆成人小视频 | 亚洲h视频在线 | 欧美日韩p片 | a级国产片| 日韩乱色精品一区二区 | 国产成人精品一区二 | 色婷婷六月天 | 亚洲黄色激情小说 | 伊人精品影院 | 婷婷六月天丁香 | 成人黄色短片 | 西西444www大胆高清图片 | 毛片网站在线观看 | 久久综合狠狠综合 | 亚洲黄色成人av | 日韩一区二区三区免费视频 | 色综合久久中文综合久久牛 | 热久久视久久精品18亚洲精品 | 国产视频久久 | 欧洲精品在线视频 | 国内精品视频一区二区三区八戒 | 在线观看av不卡 | 日本黄网站 | 久草在线资源免费 | 亚洲激情中文 | 久久久国产精品亚洲一区 | 国产精成人品免费观看 | 免费在线播放 | 国产999精品久久久久久麻豆 | 久久综合九色 | 美女福利视频网 | 成人资源在线观看 | 亚洲人成在线电影 | 国产午夜精品理论片在线 | 久久综合五月婷婷 | 午夜视频在线网站 | 久要激情网 | 99成人在线视频 | 亚洲精品小视频在线观看 | 久草在线观看资源 | 午夜av大片| 免费在线观看污 | 婷婷亚洲五月 | 久久精品9 | 人人爽人人爽人人爽学生一级 | av中文电影 | 日韩欧美一区二区三区在线 | 国产久草在线观看 | 96视频在线 | 99r在线播放| 国产精品欧美久久久久天天影视 | 久久 一区 | 日韩91av| 18做爰免费视频网站 | 色婷五月天 | 日日夜夜草 | 久久久久久草 | 超碰97在线看 | 少妇自拍av | 免费看黄网站在线 | 色综合久久综合网 | 韩国一区二区在线观看 | 国产青草视频在线观看 | 日韩激情一二三区 | 能在线看的av | 日本大尺码专区mv | 日韩欧美视频一区二区三区 | 91av在线免费播放 | 日韩av中文字幕在线免费观看 | 日韩有码欧美 | 四虎成人精品永久免费av | 久久精品影片 | 国产精品久久久久久一区二区 | 欧美在线一| 中文字幕在线免费观看 | 综合色中色 | 国产精品嫩草在线 | 在线播放日韩av | 日韩成片| 日韩在线观看高清 | 国内精品久久久久久久久久久久 | 黄色成年网站 | 337p西西人体大胆瓣开下部 | 伊人影院得得 | 黄色三级久久 | 在线免费黄网站 | 午夜视频久久久 | www.天天草 | 国色天香在线 | 久久这里 | 日韩剧情 | 成年人在线播放视频 | 国产精品18久久久久久不卡孕妇 | 中文字幕在线国产精品 | 中文字幕有码在线 | 久久久精品亚洲 | 国产精品婷婷午夜在线观看 | 久久国内精品视频 | 国产黄网在线 | 日韩理论片在线观看 | 亚洲精品视频在线 | 成人免费在线电影 | 91精品久久久久久久久 | 91综合久久一区二区 | 精品美女久久久久 | 日韩一级片大全 | 九九色视频 | 岛国精品一区二区 | 中文字幕视频网站 | 99色亚洲| 99热9| 在线亚洲人成电影网站色www | 最近最新最好看中文视频 | 久草在线手机视频 | 国产美女视频网站 | 综合色狠狠 | 国产一级黄色免费看 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 国产一级片久久 | 99精品在线免费观看 | 国产理论影院 | 国产色网站 | 在线观看91av | 麻豆94tv免费版 | 久久久久免费电影 | 国产手机在线观看视频 | 亚洲专区免费观看 | a天堂在线看| 亚洲资源网 | 国产在线观看你懂得 | 欧美一级电影片 | www.五月激情.com | 99精品视频观看 | 成人精品99 | 成人在线免费观看视视频 | 五月婷婷另类国产 | 久久久久久久久久久久久国产精品 | 99精品视频在线观看播放 | 91黄色免费网站 | 国产精品高清av | 亚洲天堂视频在线 | 国产成人精品在线观看 | 亚洲精品 在线视频 | 久热av | 最新av网站在线观看 | 久久久精品日本 | 国产免码va在线观看免费 | 亚洲资源片| 国产精品成人一区二区三区吃奶 | 久久经典国产视频 | 欧美国产不卡 | 国产成人精品女人久久久 | 国产麻豆传媒 | 亚洲精品一区二区18漫画 | 中文字幕超清在线免费 | 99色婷婷 | av免费看看 | 91热这里只有精品 | 夜夜躁日日躁狠狠久久av | 97看片吧 | 日韩精品亚洲专区在线观看 | 成人一区影院 | 亚洲 欧洲 国产 精品 | 国产精品99久久久久人中文网介绍 | 日韩伦理一区二区三区av在线 | 色综合久久综合网 | 国产一级片网站 | 黄色毛片在线 | 欧美性受极品xxxx喷水 | 天天干天天做天天操 | 最新中文在线视频 | 青青草久草在线 | 国产精品乱码在线 | 免费美女av | 97看片| 日韩h在线观看 | av在线免费观看网站 | 中文字幕免费观看全部电影 | a极黄色片 | 免费看一及片 | 国内精品久久天天躁人人爽 | 天天操天天色天天 | 日韩av在线网站 | 婷婷在线观看视频 | 91精品亚洲影视在线观看 | 91福利试看 | 成人h动漫在线看 | 久99久在线| 日韩免费在线观看网站 | 欧美电影黄色 | 亚洲日本在线视频观看 | 久久精品一二三区 | 狠狠综合久久av | 伊人在线视频 | 国产精品福利久久久 | 午夜精品久久久久久 | 黄网站app在线观看免费视频 | 日本午夜在线亚洲.国产 | 国产成人精品999在线观看 | 三级视频国产 | a久久久久久 | 欧美最猛性xxxxx免费 | 国产高清视频在线免费观看 | 久久免费资源 | 三级在线视频播放 | 欧美最新大片在线看 | 热99久久精品 | 亚洲爱视频 | 亚洲国产中文在线观看 | 99色在线 | 91麻豆精品国产自产在线游戏 | 日韩激情在线 | 久久人人爽av | 人人网av| 久久国产91| 欧美男男激情videos | 久久av观看| 国产一级一级国产 | 成人一级 | 欧美一级电影 | 99久久99久国产黄毛片 | 在线小视频你懂的 | 91色综合| 天天操天天插 | 日本久久成人中文字幕电影 | 中文在线字幕免费观 | 国产美女精品视频免费观看 | av成人动漫在线观看 | 激情久久五月 | 69国产在线观看 | 亚洲精品色 | 欧美在线视频精品 | 久久国产精品久久精品国产演员表 | 69久久久 | 最近字幕在线观看第一季 | 免费又黄又爽的视频 | 国产最新福利 | 久久免费国产 | 午夜免费视频网站 | 三三级黄色片之日韩 | 国产精品午夜久久 | 国产一区视频在线播放 | 最新日本中文字幕 | 最近中文字幕完整视频高清1 | 欧美a级片免费看 | 狠狠狠狠干 | 国产精品亚洲片夜色在线 | 亚洲va欧美va人人爽春色影视 | 99婷婷狠狠成为人免费视频 | 日韩精品久久久久 | 国产91免费看 | 婷婷丁香花五月天 | 国产一级精品在线观看 | 五月婷婷在线视频 | 日韩三级中文字幕 | av超碰免费在线 | 看毛片的网址 | 国产成人精品亚洲日本在线观看 | 丁香激情综合 | 欧美人人爱 | 日韩精品久久久久久 | 日本99干网 | 亚洲免费视频观看 | 久久久久久久免费 | 岛国大片免费视频 | 日色在线视频 | 亚洲另类视频在线观看 | 欧美成年黄网站色视频 | 免费视频一级片 | 免费日韩电影 | 久久躁日日躁aaaaxxxx | 国产精品系列在线观看 | 久久综合狠狠狠色97 | 久久99在线观看 | 亚洲精品一区二区久 | 午夜影院一级片 | 欧美国产高清 | www四虎影院 | 日日夜夜精品网站 | 射久久久 | 国产视频一区在线播放 | 夜夜操天天干, | 中文字幕专区高清在线观看 | 亚洲精品午夜aaa久久久 | 久久精品久久精品久久39 | 性色av免费在线观看 | 久久这里只精品 | 日韩大陆欧美高清视频区 | 最新av电影网站 | 欧美日韩午夜 | www.五月天色 | 日日天天狠狠 | 九九九热精品免费视频观看网站 | 久草在线视频免赞 | 手机av在线网站 | 亚洲黄色在线 | 国产精品成人aaaaa网站 | 91你懂的 | 欧美日韩精品网站 | 中文字幕免费观看视频 | 黄色特级毛片 | 久久夜色电影 | 亚洲精品短视频 | www.超碰97.com| 国产在线传媒 | 中文字幕在线观看资源 | 亚洲国产欧美一区二区三区丁香婷 | a√天堂中文在线 | 久久综合免费视频影院 | 又爽又黄又刺激的视频 | 国产精品99久久久久久小说 | 久一久久 | 国产自偷自拍 | 又黄又爽又刺激 | 96精品视频 | 国产成人精品日本亚洲999 | 国产成人精品三级 | 在线观看国产区 | 国产成人av在线 | 激情五月播播久久久精品 | 51精品国自产在线 | 人人爽人人爽人人爽学生一级 | 波多野结衣久久资源 | avwww在线 | 91看片在线免费观看 | 福利一区二区在线 | 91精品一区二区三区蜜臀 | 久久毛片高清国产 | 久久不色 | 中文字幕日韩一区二区三区不卡 | 欧美一级裸体视频 | 国产一区在线免费观看视频 | av三级在线播放 | 欧美特一级 | 亚洲国产中文字幕在线 | 欧美一区在线看 | 91麻豆精品国产91久久久无限制版 | 欧美激情视频在线免费观看 | 成人av网站在线观看 | 国产色黄网站 | 99久久日韩精品免费热麻豆美女 | 亚洲免费观看在线视频 | 中文在线免费一区三区 | 免费看黄20分钟 | 免费国产在线观看 | 激情久久一区二区三区 | 国产精品k频道 | 国产视频色 | 黄色小网站免费看 | 欧美日韩另类在线观看 | 国产韩国日本高清视频 | 精品视频久久久久久 | 激情综合网天天干 | 狠狠干中文字幕 | www.久久久| 日韩精品无码一区二区三区 | 精品久久片| 久久精品一级片 | 一级一片免费看 | 欧女人精69xxxxxx | 中文字幕在线精品 | 最近最新中文字幕 | 中文字幕在线观看播放 | 成 人 黄 色 视频免费播放 | 激情欧美xxxx | 国产色婷婷在线 | 久久久福利| av高清网站在线观看 | 亚洲精品在线免费看 | 亚洲国产欧美一区二区三区丁香婷 | 黄色在线看网站 | 国产在线观看,日本 | 92国产精品久久久久首页 | 91av在| 99久久久久成人国产免费 | 中文字幕在线播放一区二区 | 2019天天干天天色 | 国产人免费人成免费视频 | 91香蕉视频好色先生 | 欧美资源在线观看 | 国产精品一区二区久久久 | 日韩色区 | 黄色一二级片 | 最近中文字幕免费大全 | 日韩精品一区二区三区水蜜桃 | 国产精品精品国产 | 伊人久久国产 | 国产一二三四在线视频 | 国产亚州精品视频 | 久久成人综合视频 | 国产明星视频三级a三级点| 亚洲欧美日韩一区二区三区在线观看 | 国产精品久久久久久久久久直播 | 超碰在线99 | 中文字幕国产精品一区二区 | 黄网站色欧美视频 | 国产一级黄色免费看 | 欧美午夜性生活 | 成人在线观看免费 | 成人在线播放免费观看 | 免费视频国产 | 97色在线观看免费视频 | 91久久国产露脸精品国产闺蜜 | 欧美日韩不卡在线 | 在线日韩一区 | 国产亚洲在线观看 | 色噜噜噜 | 天天综合五月天 | 亚洲成人午夜在线 | 欧美色图一区 | 久久国产精品99久久久久久进口 | 99爱视频在线观看 | 九九99视频 | 激情深爱五月 | 国产在线观看免费观看 | 久久婷婷国产色一区二区三区 | 国产精品久久免费看 | 丁香综合av | 欧美日韩亚洲国产一区 | 91精品国产99久久久久 | 久草视频国产 | 国产一区视频导航 | 色婷婷精品| 亚洲一区二区黄色 | 99精品一级欧美片免费播放 | 麻豆视屏| 亚洲国产一区二区精品专区 | 在线视频日韩 | 深夜男人影院 | 久久69av| 91在线区 | 久久夜色精品国产欧美一区麻豆 | 91九色蝌蚪视频网站 | 国产精品久久久久久一区二区三区 | 国产第一页精品 | 亚洲国产精品成人女人久久 | 欧美肥妇free | 欧美日韩精品网站 | 国产又黄又猛又粗 | 日韩一级片大全 | 日韩网 | 成年人在线观看 | 久久精品国产亚洲aⅴ | 久草资源免费 | 成人永久在线 | 黄色的网站免费看 | 日韩午夜大片 | 亚洲激情视频在线 | 欧美成天堂网地址 | 色视频网站免费观看 | japanese黑人亚洲人4k | av电影久久 | av免费观看网站 | 中文字幕国内精品 | 国产精品成人一区二区三区吃奶 | 在线电影播放 | 美女久久久久 | 精品免费久久久久 | 一本之道乱码区 | 日本激情动作片免费看 | 500部大龄熟乱视频使用方法 | 天天干天天想 | 成人h电影在线观看 | 外国av网 | 丁香六月在线 | 色噜噜狠狠色综合中国 | 天天色天天色天天色 | 亚洲日本va午夜在线电影 | 中文字幕丝袜制服 | 亚洲国产精品人久久电影 | 91桃色免费视频 | 国产成人av电影在线 | 色99久久| 久草网免费 | 精品久久一级片 | 91九色视频在线观看 | 成人资源在线播放 | 午夜视频不卡 | 亚洲最新av在线网站 | 久久久久久久久久电影 | 99视频导航 | 色狠狠干 | 狠狠色丁香| 中文字幕日本在线观看 | 亚洲第二色 | 美女视频黄色免费 | 超碰在线亚洲 | 岛国大片免费视频 | 九九精品毛片 | 夜夜操狠狠操 | 欧美日韩在线视频一区 | 成人国产精品久久久久久亚洲 | 国产精品久久久久久久久久直播 | 久久精品一区二区三区四区 | 欧美污在线观看 | 一区二区日韩av | 久久久美女 | 中国一区二区视频 | 国产精品久久久影视 | 99热精品在线观看 | 91在线观看高清 | 国内精品久久久久影院一蜜桃 | 欧美在线视频一区二区三区 | 最近中文字幕mv免费高清在线 | 色综合久久精品 | 日本公妇在线观看高清 | 在线观看黄网站 | www欧美色 | 香蕉影视 | 在线观看色网站 | 99久久久国产精品免费99 | 激情综合交| 99re6热在线精品视频 | 日本久久久久久 | 久久久免费看 | 中文字幕在线观看2018 | 日日麻批40分钟视频免费观看 | 久久久久久久福利 | 久久99精品国产99久久 | 91av片| 成人一级片免费看 | 亚洲一级二级三级 | 日本中文字幕视频 | 亚洲欧美观看 | 久久久久久蜜av免费网站 | 公与妇乱理三级xxx 在线观看视频在线观看 | 久99久精品视频免费观看 | 日本精品久久久一区二区三区 | 一区二区三区在线不卡 | 久久久久免费精品国产 | 国产精品毛片一区 | 久久综合久久久久88 | 91亚洲综合 | 久久久久久久久爱 | 欧美日韩亚洲在线 | 丁香婷婷射 | 色多多污污在线观看 | 精品在线看 | 日本精品视频网站 | 免费麻豆网站 | 九九九热 | 狠狠五月天 | 草久在线播放 | 欧美精品一区二区在线观看 | 久草精品视频在线播放 | 久久婷婷精品 | 青草视频在线 | 麻豆传媒在线免费看 | 天天干天天摸 | 国产成人专区 | 91成人精品 | 中文字幕中文字幕在线中文字幕三区 | 国产精品毛片久久久久久久久久99999999 | www夜夜 | 国产在线视频不卡 | 免费观看完整版无人区 | 精品一区二区综合 | 国产高清视频在线播放一区 | 狠狠躁日日躁狂躁夜夜躁 | www.xxxx欧美| 国产精品成人久久久 | 久久少妇av | 国产免费久久av | 99精品国产兔费观看久久99 | 亚洲一二三久久 | 97色在线视频 | 国产99区| 午夜精品一区二区三区免费视频 | 中文字幕日韩免费视频 | av爱干 | 国产a级免费| 一区二区视频在线免费观看 | 久久九九久久九九 | 亚洲va综合va国产va中文 | 久久国产精品电影 | 国产夫妻自拍av | 99久久综合狠狠综合久久 | 久久国产精品99久久久久久丝袜 | 日韩激情片在线观看 | 亚洲综合色视频在线观看 | 欧美日韩精品久久久 | 美女免费视频网站 | 开心激情婷婷 | 日韩三级视频在线看 | 久久久久久久久久久久久久免费看 | 亚洲国产精品久久久久久 | 最新中文字幕 | 国产精品欧美日韩 | 欧美精品久久久久久久 | 在线观看一级视频 | 四虎影视精品 | 久久综合狠狠综合 | 免费麻豆 | 亚洲一区二区视频在线播放 | 免费在线观看午夜视频 | 亚洲午夜精品久久久 | 丝袜+亚洲+另类+欧美+变态 | 丁香电影小说免费视频观看 | 国产黄色美女 | 91视频免费网址 | 久久精品久久精品久久精品 | 最新久久免费视频 | 在线视频第一页 | 精品久久国产一区 | 久久99精品久久久久久清纯直播 | 中文资源在线观看 | 国产最新91| 久久曰视频 | 国产精品高潮在线观看 | 特级西西www44高清大胆图片 | 欧美激情精品久久久久久免费印度 | 日日夜夜天天操 | 亚洲欧美国产精品久久久久 | 特级黄色片免费看 | 五月婷婷香蕉 | 成人在线免费看 | 午夜在线免费观看 | 在线视频免费观看 | 欧美成人理伦片 | 五月在线 | 99免费国产| 99视频一区 | 国产专区视频在线观看 | 91精品国产乱码在线观看 | 国产毛片久久久 | 久久国产区| 成人手机在线视频 | 国产韩国日本高清视频 | 色综合色综合久久综合频道88 | 开心激情综合网 | 国内外成人免费在线视频 | 精品久久精品 | 在线视频 91 | 精品视频在线看 | 天天干天天天天 | 日本久久精品 | 7777xxxx| 91天堂素人约啪 | 亚洲国产精品久久久久婷婷884 | 国产精品99久久久精品免费观看 | 免费欧美 | 日韩理论| 91丨九色丨国产丨porny精品 | 免费av看片 | 免费视频久久 | 免费看片成人 | 国产精品久久久久久久7电影 | 99久久激情视频 | 在线观看成人毛片 | 亚洲h在线播放在线观看h | 四虎影视成人永久免费观看亚洲欧美 | 日韩精品视频免费专区在线播放 | 色在线观看网站 | 国产亚洲成人精品 | 狠狠操狠狠操 | 美女久久99 | 高清国产午夜精品久久久久久 | 天天操天天草 | 好看的国产精品视频 | www.久久色.com | 永久黄网站色视频免费观看w | av在线播放亚洲 | 国产精品久久99综合免费观看尤物 | 国产精品va在线观看入 | 91原创在线观看 | zzijzzij日本成熟少妇 | 福利视频午夜 | 久久伊人精品天天 | 日韩首页 | 国产精品视频地址 | 97电影手机 | 久久99热这里只有精品 | 二区在线播放 | 热re99久久精品国产99热 | 亚洲国产精品资源 | 日本在线中文在线 | 日韩黄色免费 | 国产精品久久久av久久久 | 国产最新在线观看 | 国产手机av | 亚洲国产99 | 中文在线免费视频 | 精品久久精品 | 免费视频久久 | 色综合天天狠狠 | 色香蕉网 | 少妇bbw撒尿| 国产精品2018 | 久久精品爱视频 | 日韩精品一区不卡 | 亚洲精品欧洲精品 | 麻豆精品在线 | 久久九九国产精品 | 在线视频国产区 | 五月激情久久 | 精品国内自产拍在线观看视频 | www.色就是色 | 国产福利一区二区在线 | 激情丁香久久 | 99精品视频在线观看免费 | 国产福利一区二区在线 | 中文字幕精品久久 | 欧美日韩一区二区三区不卡 | 免费视频一区二区 | 高清不卡毛片 | 亚洲精品国产精品国 | 91在线一区二区 | 狠狠色丁香久久综合网 | 夜夜躁天天躁很躁波 | 亚洲国产精品电影在线观看 | 激情综合网五月婷婷 | 色婷婷六月天 | 美女网站视频免费黄 | aa级黄色大片 | 久久久久久久久久久免费视频 | 久久人人做 | 亚洲一级电影在线观看 | 国产人成在线视频 | 久久久久久久久久久久影院 | 激情久久久久久久久久久久久久久久 |