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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

Hamcrest Matchers,Guava谓词和Builder设计模式

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

通常,在編碼時,我們必須處理其中包含數(shù)十個字段的一些POJO對象。 很多時候,我們通過一個帶有數(shù)十個參數(shù)的構(gòu)造函數(shù)來初始化這些類,這以任何可能的想象的方式都是可怕的。 除此之外,使用這些構(gòu)造函數(shù)的函數(shù)幾乎不可測試。 讓我們仔細(xì)研究一下使用Builder來改變這種情況,以及Hamcrest匹配器和Guava Predicates對它進行單元測試。 讓我們開始看一下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();} }

現(xiàn)在看一下為了擺脫龐大構(gòu)造函數(shù)的使用而使用的builder類。 而且,您可以設(shè)置任何所需的內(nèi)容,而無需為不需要的字段輸入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函數(shù),該函數(shù)驗證對象是否處于所需狀態(tài)。 這樣,如果某些條件不完整,我們可能不允許創(chuàng)建對象。 對于這種情況,我們使用番石榴的謂詞– checkNotNull方法。

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

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;} }

請注意,現(xiàn)在創(chuàng)建對象非常清楚,定義一個字段是否已設(shè)置也很容易。

讓我們繼續(xù)進行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);} }

簡單的重構(gòu)可以使它們看起來更好……

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代替函數(shù)呢?

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");}};} }

以下主要方法執(zhí)行服務(wù)的功能:

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設(shè)計模式 ,該博客適用于上癮的編碼博客。

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

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

在线观看麻豆av | 超级碰99 | 中文字幕不卡在线88 | 亚洲第一中文网 | 最近中文字幕高清字幕免费mv | 超碰人人射 | 亚洲午夜久久久综合37日本 | 欧美国产在线看 | 青青河边草免费 | 国产在线小视频 | 91在线视频免费播放 | 欧美日韩中文字幕在线视频 | 精精国产xxxx视频在线播放 | 欧美日韩观看 | 中文av不卡| 日韩色在线观看 | 国产资源中文字幕 | 中文在线8新资源库 | 免费影视大全推荐 | 五月婷婷色丁香 | 狠狠色丁香婷婷综合欧美 | 亚洲免费一级电影 | 国产亚洲字幕 | 在线观看的a站 | 亚洲精品视频免费在线 | 国产女人40精品一区毛片视频 | 国产成人精品久久亚洲高清不卡 | 日韩av福利在线 | 91资源在线视频 | 国产午夜激情视频 | 久久久影院一区二区三区 | 超碰97在线资源 | 在线观看久久 | 国产又黄又爽无遮挡 | 丁香在线观看完整电影视频 | 精品国产中文字幕 | 国产视频黄 | 国产成人一区在线 | 久久午夜电影网 | 99爱精品视频 | 国产精品综合在线 | 国产91精品久久久久久 | 日日夜夜噜噜噜 | 国产一区二区在线精品 | 黄色av免费电影 | 国产成人久 | 九九久久国产精品 | 奇米影视在线99精品 | 天天综合导航 | 日韩试看 | 久久99精品久久久久久三级 | 欧美一区日韩一区 | 成年人在线观看网站 | 伊人天堂av | 中文字幕亚洲欧美日韩2019 | 欧美做受xxx | 又长又大又黑又粗欧美 | 成人在线视频免费 | 97国产在线视频 | 91视频在线免费 | 97香蕉久久国产在线观看 | 伊人色综合久久天天网 | 91精品播放 | 91热精品| 中文一区在线 | 婷婷丁香狠狠爱 | 欧美激情视频三区 | 99福利片| av免费网站在线观看 | 人人爽人人片 | 久久久久久久免费 | 日本中文在线观看 | 国产在线免费观看 | 久久新视频 | 成人h在线观看 | 婷婷视频 | 丝袜美女在线 | 天天干天天摸天天操 | 人人艹人人 | 日韩午夜一级片 | 玖玖爱免费视频 | 欧美日韩国语 | 欧美狠狠操 | 婷婷国产一区二区三区 | 久久久久久久久毛片精品 | 最近中文字幕完整视频高清1 | 在线国产91 | 激情婷婷亚洲 | 521色香蕉网站在线观看 | 亚洲黄色软件 | 91精品老司机久久一区啪 | 国产一级在线看 | 国产第一页在线观看 | 亚洲精品天天 | 国产一级精品在线观看 | a极黄色片 | 五月婷网站 | 日韩久久久久久久久久 | 永久免费的啪啪网站免费观看浪潮 | 天天插日日操 | 亚洲三级视频 | 黄色日批网站 | 国产韩国精品一区二区三区 | 欧美精品久久久久久久久免 | 久久刺激视频 | 国产一级久久 | 不卡中文字幕在线 | 手机av资源 | 99热在线精品观看 | 奇米四色影狠狠爱7777 | 亚洲无吗天堂 | 91精品办公室少妇高潮对白 | 成年人在线看视频 | 成人性生交大片免费看中文网站 | 亚洲精品美女久久久久网站 | 国产一区国产二区在线观看 | 一区二区三区免费在线观看视频 | 欧美精品一区二区免费 | 精品久久久久久久久久久院品网 | 婷婷激情影院 | 免费污片 | 麻豆视频免费观看 | 毛片在线播放网址 | 精品一区二区久久久久久久网站 | 日日干影院| 黄色特一级片 | 久草在线观看视频免费 | 狠狠狠狠狠狠干 | 国产黄色在线观看 | 久久99精品国产麻豆宅宅 | av网站免费在线 | 国产一区电影在线观看 | 成年人电影免费在线观看 | 99精品国产在热久久下载 | 香蕉视频在线播放 | 五月天色综合 | 亚洲精品中文字幕在线观看 | .精品久久久麻豆国产精品 亚洲va欧美 | 午夜精品99久久免费 | 久草视频网 | 亚洲精品www久久久久久 | 天天天天天天干 | 日本中文字幕在线视频 | 免费观看黄色12片一级视频 | 91视频国产高清 | 超碰97网站 | 免费观看的av网站 | 国产香蕉视频在线观看 | 久久影视网 | 久久免费高清视频 | 久久免费视频观看 | 深爱激情久久 | 色偷偷97 | av电影中文 | 人人爽人人香蕉 | 人人爽人人爽人人片av | www.99av | 国产成人在线播放 | 午夜精品电影一区二区在线 | 91麻豆福利 | 久久亚洲视频 | 久久午夜视频 | 97天天干| 91精品视频在线播放 | www.色午夜.com | 国产永久免费观看 | 国产亚洲精品免费 | 色五月色开心色婷婷色丁香 | 亚州日韩中文字幕 | 亚洲欧美日韩精品久久久 | 九九九免费视频 | 美女精品网站 | 日韩精品极品视频 | 久草视频一区 | 成人香蕉视频 | 国产韩国日本高清视频 | 日韩黄色一区 | 国产亚洲精品久久久久动 | 亚洲视频电影在线 | 99热精品久久 | 欧美日韩成人 | 国产精品久久久久一区二区国产 | 日韩一二区在线 | 国产美女视频 | 成人超碰97| 久久电影中文字幕视频 | 久草网站在线观看 | 久久av网址| 99久久婷婷国产 | 亚洲精品在线视频播放 | 六月丁香在线观看 | 亚洲视频免费在线观看 | 精品国产区在线 | 2023天天干| 天天操操操操操 | 欧美在线视频不卡 | 天天综合网入口 | 91网免费看 | 欧美成人黄 | 国产成人亚洲精品自产在线 | 三级黄色欧美 | 日韩三级精品 | www黄色com | 一区二区三区在线免费 | 亚洲二区精品 | 国语麻豆| 久久婷婷一区二区三区 | 国产成人精品久 | 91女神的呻吟细腰翘臀美女 | 亚洲综合一区二区精品导航 | 国产成人在线看 | 亚洲精品色 | 在线不卡的av | 91九色蝌蚪国产 | 97超碰在| 亚洲精品网站在线 | 天天射综合网站 | 久久午夜国产精品 | 久久久久久久久久伊人 | 婷婷香蕉 | 在线成人中文字幕 | 五月婷激情 | 成人久久久久 | 国产精品专区在线 | 欧美日韩免费看 | 免费性网站 | 精品国产一区二区三区男人吃奶 | 久久综合狠狠综合久久狠狠色综合 | 亚洲开心激情 | 久久黄色小说视频 | 国产精品久久久久久久久久久不卡 | 视频成人 | 日韩成人xxxx | 综合色影院 | 日韩精品网址 | 国内精品在线看 | 999国内精品永久免费视频 | 亚洲国产成人久久 | 久久99国产精品免费 | 婷婷在线免费 | 在线婷婷 | 在线观看国产日韩 | 国产 日韩 欧美 在线 | 国产字幕在线观看 | 国产精品福利久久久 | 精品一区二区三区香蕉蜜桃 | 免费日韩av片 | 天天天干天天射天天天操 | 日韩在线观看一区二区三区 | 久久精品视频18 | 成人黄视频| 久久综合久久伊人 | 久久在线精品视频 | 97免费中文视频在线观看 | 夜夜摸夜夜爽 | 美国av大片 | 日韩一二区在线 | 国产小视频国产精品 | 久久久国产影院 | 成人免费视频视频在线观看 免费 | 精品国产精品一区二区夜夜嗨 | 日韩手机在线 | 国产精品综合av一区二区国产馆 | 91麻豆网站 | 成人一级视频在线观看 | 91精品婷婷国产综合久久蝌蚪 | 2019久久精品 | 免费视频在线观看网站 | 久影院| 最近日韩免费视频 | 综合激情av | 欧美另类xxx| 日韩国产欧美视频 | 亚洲精品88欧美一区二区 | 亚洲日本va午夜在线影院 | 久久婷婷一区二区三区 | 欧美一级免费片 | 国产一级小视频 | 日韩欧美在线观看 | 欧美激情视频一二区 | 欧美激情综合五月色丁香小说 | 欧美作爱视频 | 免费黄a大片 | 探花视频免费观看高清视频 | 一级片视频在线 | 欧美一区日韩一区 | 国产高清视频在线播放一区 | 欧美成人精品欧美一级乱 | 精品视频区 | 77国产精品| 激情婷婷在线观看 | 热99在线| 99在线视频播放 | 在线免费观看视频a | 日韩欧美一区二区三区视频 | 色婷婷国产在线 | 97免费在线观看 | 国产精品高潮呻吟久久久久 | 色国产精品一区在线观看 | 亚洲精品国产视频 | 欧美极品裸体 | 日本精品视频在线 | 91av视频网站 | 激情五月激情综合网 | 91精品国产福利 | 高清av免费观看 | 色天堂在线视频 | 波多野结衣在线观看一区二区三区 | 国产精品久久久久久久婷婷 | 亚洲免费国产 | 国产一区二区在线免费 | 亚洲国产av精品毛片鲁大师 | 天天色天天操天天爽 | 免费在线播放视频 | 日韩com| 又黄又爽的视频在线观看网站 | 人人澡人摸人人添学生av | 久久综合色播五月 | 日韩视频在线不卡 | www.夜夜夜 | 国产视频中文字幕在线观看 | 国产免费又黄又爽 | 欧美精品xxx| 在线观看一级 | 国产精品日韩在线观看 | 日韩美女高潮 | 午夜美女av| 伊甸园av在线 | 国产二区视频在线 | 日韩在线精品一区 | 国内成人精品视频 | 在线黄色国产电影 | 婷婷六月网| 深夜免费福利 | 五月婷在线播放 | 99精品在线免费 | 美女免费黄视频网站 | 色噜噜在线观看视频 | 中文字幕在线观看播放 | www.av免费| 国内精品久久久久久 | 久久精品美女视频 | 国产精久久久久久久 | 久久无码av一区二区三区电影网 | 超碰伊人网 | 欧美一区二区三区四区夜夜大片 | 又色又爽又黄高潮的免费视频 | 国产精品国产亚洲精品看不卡15 | 4438全国亚洲精品在线观看视频 | 日韩视频1区 | 国产高潮久久 | 黄色亚洲片 | 久久精品综合 | 中文字幕亚洲情99在线 | 91视视频在线直接观看在线看网页在线看 | 久久久久久久久影视 | 国产精品v欧美精品v日韩 | 日韩免| 亚洲一一在线 | 欧美狠狠操 | 99视频免费观看 | 亚洲精品乱码久久 | 亚洲国产一区二区精品专区 | 一区二区三区在线免费播放 | 中国精品一区二区 | 婷婷色综合色 | 超碰人在线| 亚洲成人av电影在线 | 99精品视频一区二区 | 精品一区二区三区久久久 | 天天艹天天 | 九色91av | 2022国产精品视频 | 亚洲欧美色婷婷 | 中文一区在线 | 91伊人| 黄色av免费 | 国产精品激情偷乱一区二区∴ | 久草在线视频首页 | 日韩欧美国产视频 | 亚洲91av| 91喷水| a成人v在线 | 国产午夜精品一区二区三区四区 | 免费影视大全推荐 | 免费看黄色大全 | 91成年视频 | 久久视频精品在线观看 | 播五月综合 | 91av国产视频| 免费在线观看成年人视频 | 中文一二区 | 日韩av美女| 久久精品一| 婷婷国产在线 | 国产美女网站在线观看 | 五月婷婷激情综合 | 国产精品嫩草影视久久久 | 国产一级视频在线免费观看 | 婷婷丁香花| 天堂av在线网址 | 国外成人在线视频网站 | 国产经典 欧美精品 | 成人91免费视频 | 久久精品亚洲综合专区 | 人人爽人人舔 | 一区二区三区日韩在线观看 | 美女性爽视频国产免费app | 五月丁婷婷 | 在线看欧美| 国产视频日本 | 天天综合网天天 | www.五月天激情 | 在线岛国av| 色婷婷在线视频 | 在线视频中文字幕一区 | 日韩在线视频网址 | 久久免费看 | 欧美性生爱| 婷婷在线资源 | 激情久久久 | 丁香影院在线 | 99在线观看 | 国产成人av电影在线 | 天天插日日射 | 免费观看一区二区三区视频 | 亚洲女人天堂成人av在线 | 日韩成人在线一区二区 | 麻豆91视频 | 日韩,中文字幕 | 激情影音| 亚洲午夜精 | 免费久久99精品国产婷婷六月 | 国产二区免费视频 | 在线免费观看的av网站 | 伊人久久在线观看 | 久热只有精品 | 日本久热| 97在线视频免费看 | 午夜黄色影院 | 亚洲日本一区二区在线 | 最新极品jizzhd欧美 | 国产在线91精品 | 色久av | 五月天欧美精品 | 国产精品自产拍在线观看网站 | 中文av日韩 | 亚洲国产精品一区二区久久hs | 日韩av电影手机在线观看 | 国产精品日韩 | 激情黄色一级片 | 免费日p视频 | 欧美a视频在线观看 | 亚洲国产精品久久久久久 | 亚洲成人动漫在线观看 | 欧美亚洲久久 | aa级黄色大片 | 久久久免费精品视频 | 欧美日韩视频在线一区 | 探花国产在线 | 91人人干| 色综合天天综合 | 久久久精品网 | 免费在线国产 | 国产精品1024 | 最近中文字幕免费视频 | 中文字幕在线免费观看 | 人人讲 | 国产午夜三级一二三区 | 色橹橹欧美在线观看视频高清 | 成人国产网址 | 99视频免费观看 | 日韩理论在线观看 | 亚洲成人第一区 | 人人澡人人澡人人 | 欧美精品一区二区在线播放 | 欧美成人xxx| 久草在线手机视频 | 国产女人40精品一区毛片视频 | 国产精品夜夜夜一区二区三区尤 | 国产精品久久嫩一区二区免费 | 国产手机在线观看视频 | 欧美日韩一区久久 | 天天爽人人爽 | 国产九色在线播放九色 | 在线观看精品视频 | 天天干婷婷 | 91麻豆精品91久久久久同性 | 亚洲资源视频 | 亚洲免费一级 | 国产精品一区二 | 91丝袜美腿| 日韩视频免费观看高清完整版在线 | 狠狠干2018 | 国产精品入口66mio女同 | 正在播放 国产精品 | 久久精品视频18 | 在线免费观看黄网站 | 我爱av激情网 | 欧美在线18| 婷婷日日 | 国产中文字幕视频在线观看 | 蜜臀av性久久久久av蜜臀妖精 | 在线观看国产www | 波多野结衣电影久久 | 免费a v在线| 九九九九色| 亚洲国产美女久久久久 | 在线观看中文字幕dvd播放 | 亚洲精品国偷拍自产在线观看 | av超碰在线观看 | 免费看国产曰批40分钟 | 日日摸日日爽 | 色干综合 | 亚洲伊人天堂 | 色网站在线免费 | 国产精品专区一 | 国产精品2018 | 久久综合九色99 | 成人av影视观看 | 激情网站五月天 | 91人人爽人人爽人人精88v | 激情综合五月网 | 91最新在线观看 | 久久综合久久综合九色 | 天天操天天谢 | 免费一级毛毛片 | 亚洲高清视频在线观看免费 | 伊人国产女| 久久免费国产精品1 | 亚洲欧美乱综合图片区小说区 | 69国产精品视频免费观看 | 天天天天爽 | 国产亚洲资源 | 在线国产能看的 | 少妇性bbb搡bbb爽爽爽欧美 | 婷婷av色综合 | 成人黄色小视频 | 欧美日韩免费看 | 日本精品视频一区二区 | 夜色资源站wwwcom | 久操视频在线观看 | 午夜久久网站 | 在线看片一区 | 久艹视频免费观看 | 福利久久久 | 91麻豆精品国产91久久久无需广告 | 99久热在线精品视频成人一区 | 亚洲精品乱码久久久久久蜜桃不爽 | 91网免费观看 | 精品亚洲国产视频 | 国产黄色大全 | 亚洲人久久 | 久久9视频 | 国产久草在线观看 | 国产精品黑丝在线观看 | av免费播放| 中文字幕国产在线 | 国产精品久久久久久吹潮天美传媒 | av中文资源在线 | 亚洲永久国产精品 | 色婷婷啪啪免费在线电影观看 | 97人人模人人爽人人喊网 | www欧美色 | 中文字幕的 | 中文字幕第一 | 狠狠的干狠狠的操 | 最新久久久 | 国产手机av| 黄色1级大片 | 黄色毛片视频免费观看中文 | 夜又临在线观看 | 天天做夜夜做 | 久久久18| 精品久久久久久亚洲综合网 | 中文永久字幕 | 国产一性一爱一乱一交 | 国产 日韩 欧美 中文 在线播放 | 日韩欧美在线高清 | 欧美性生活一级片 | 午夜精品视频一区二区三区在线看 | 亚洲精品成人av在线 | 99久久er热在这里只有精品66 | 久久久99精品免费观看app | 97人人模人人爽人人喊网 | 开心激情五月婷婷 | 日日夜夜天天综合 | 亚洲综合色丁香婷婷六月图片 | av网站在线观看免费 | 最近久乱中文字幕 | 久久国产精品一区二区三区四区 | 日本高清免费中文字幕 | 国产精品18毛片一区二区 | 久久亚洲免费 | 精品视频在线看 | 黄色a一级视频 | 欧美 另类 交 | 中文字幕国产精品一区二区 | 精品一区二区视频 | 日韩极品在线 | 久久日本视频 | 91mv.cool在线观看 | 五月婷婷在线视频观看 | 激情网在线视频 | 在线播放视频一区 | 91精品久久久久久久99蜜桃 | 91cn国产在线| 午夜精品三区 | 国内久久久久 | 欧美日韩高清国产 | 久久视影| 99国产在线观看 | 天天操夜夜看 | 91pony九色丨交换 | 在线观看黄网站 | 国产999精品久久久影片官网 | 国产久草在线观看 | 国产精品亚 | 在线成人中文字幕 | 欧美日韩在线视频免费 | www五月婷婷 | 丁香久久五月 | 在线视频观看成人 | 91视频 - 114av | 亚洲男男gⅴgay双龙 | 又湿又紧又大又爽a视频国产 | 色资源二区在线视频 | 欧美一级久久久久 | 中文字幕一区二区三区视频 | 亚洲最快最全在线视频 | 国产精品亚洲成人 | 国产精品原创视频 | av在线免费网 | 日韩在线看片 | 欧美成人黄色 | 808电影 | www最近高清中文国语在线观看 | av在观看| 国产成人精品国内自产拍免费看 | 日免费视频 | 国产九九热 | 午夜精品一区二区三区免费 | 亚洲第一区在线观看 | 又色又爽又黄 | 国产99久久久国产精品免费看 | 91精品国产91 | 久久99精品视频 | 超碰在线中文字幕 | 超碰在线中文字幕 | 91在线操 | 欧美一级片免费观看 | 97偷拍在线视频 | 天天色综合天天 | 天天干天天操天天射 | 97超碰中文字幕 | 成人免费视频播放 | 国产视频网站在线观看 | 免费观看av | 欧美日韩亚洲精品在线 | 最新一区二区三区 | 亚洲情感电影大片 | 欧美成人亚洲 | 蜜臀av麻豆| 一区在线免费观看 | 中文字幕在线免费播放 | 日本三级在线观看中文字 | 黄色精品国产 | 成人av资源网站 | 成人av资源在线 | 伊人电影天堂 | 在线成人看片 | 免费看一及片 | 亚洲va在线va天堂 | 免费黄色在线网站 | 99久久精品免费看国产麻豆 | 色成人亚洲 | 亚洲精品乱码久久久久久蜜桃动漫 | 免费黄色小网站 | 久久久综合香蕉尹人综合网 | 日韩中文字幕免费在线观看 | 成人综合婷婷国产精品久久免费 | 91精品啪在线观看国产线免费 | 久久影视中文字幕 | 国产99久久久国产精品免费看 | 国产手机在线精品 | 99人久久精品视频最新地址 | 四虎在线免费观看 | 五月天视频网站 | 中文字幕色播 | 久久国产精品二国产精品中国洋人 | 久久视精品 | 成人免费在线播放视频 | 国产精彩视频一区 | 五月天天色 | 亚洲波多野结衣 | 久草在线视频网站 | 天天干,天天干 | 亚洲一区欧美精品 | 97夜夜澡人人爽人人免费 | 超碰九九 | 久久精品视频国产 | 国产99久久久精品视频 | 免费性网站 | 久久精品国亚洲 | 午夜精品av | 一区二区欧美激情 | 色综合人人 | 天天婷婷 | 欧美精品一级视频 | 中文字幕精品一区 | 国产三级在线播放 | 精品在线看| 亚洲国产人午在线一二区 | 97色婷婷| 一区二区三区免费在线 | 久久视屏网 | 中文字幕免费国产精品 | 99福利影院 | 超碰97网站 | 天天干天天干天天射 | 亚洲国产中文在线观看 | 色999五月色 | 婷婷丁香狠狠爱 | 日韩乱色精品一区二区 | 精品99在线 | 色婷婷一区 | 亚洲国产成人av网 | 国产精品免费观看网站 | 综合久久综合久久 | 黄色三级在线观看 | 久久精品视频国产 | 日韩欧美精品在线 | 99re中文字幕 | 主播av在线 | 婷婷色中文网 | 免费a视频在线观看 | 日韩欧美在线综合网 | 91成人免费在线视频 | 亚洲精品国产精品乱码不99热 | 精品国产a | 开心丁香婷婷深爱五月 | 国产精品久久久一区二区 | 日日干av| www.大网伊人 | 精品国产精品国产偷麻豆 | 天天射天天搞 | 国产午夜精品免费一区二区三区视频 | 国产午夜三级一二三区 | 国产午夜不卡 | 亚洲黄色精品 | 久久久久久久久久久免费 | 欧美精品久久天天躁 | 99久久久国产精品免费99 | 国产视频在线观看一区 | 精品久久久久久久久亚洲 | 久久久久久网址 | 日韩精品免费在线播放 | 九色在线视频 | 亚洲国产精品电影 | 精品视频97| 免费在线观看视频a | 亚洲中字幕 | 国产精品视频在线看 | 碰天天操天天 | 中文一二区 | 国产91精品看黄网站在线观看动漫 | 蜜臀av在线一区二区三区 | www久久国产 | 国产成人精品电影久久久 | 久久久亚洲网站 | 国产亚洲精品久久网站 | 人人澡澡人人 | 天天操天天射天天爱 | 亚洲深夜影院 | 91中文字幕在线观看 | 中文字幕永久 | 日韩精品视频在线观看免费 | 欧美日本啪啪无遮挡网站 | 亚洲精品在线网站 | 欧美一级爽 | 久久久久久久久久久国产精品 | 色多多污污在线观看 | 91成人在线免费观看 | 69视频国产 | 国产啊v在线 | 亚洲日日日 | 欧美一级视频免费 | 18久久久久| 808电影 | 丰满少妇在线观看网站 | 中文字幕免费高清av | 国产午夜三级一区二区三 | 97超碰在线久草超碰在线观看 | 亚洲天堂网在线视频观看 | 在线看一级片 | 久久伊人精品天天 | 免费看久久久 | 97在线观看视频国产 | 中文字幕在线免费看线人 | 就操操久久 | 不卡av电影在线观看 | 最新日韩视频在线观看 | 中文字幕在线久一本久 | 天天综合网久久 | 最近免费中文视频 | 99这里只有精品视频 | 免费看亚洲毛片 | 在线免费观看成人 | 亚洲精品美女久久17c | 午夜性生活片 | 美女视频黄的免费的 | 国产精品美女视频 | 少妇性aaaaaaaaa视频 | 91在线精品播放 | 亚洲精品在线一区二区三区 | 97电影在线 | 91大神精品视频在线观看 | 91人人揉日日捏人人看 | 日日操夜夜操狠狠操 | 成年人网站免费在线观看 | 正在播放一区二区 | 日韩精品在线视频免费观看 | 特级西西444www大精品视频免费看 | 国产明星视频三级a三级点| 精品少妇一区二区三区在线 | 欧美精品久久久久a | 国产精品一二 | 亚洲无线视频 | 久久九九久久精品 | 99视频播放 | 欧美在线free | 操操操av| 日韩精品一区电影 | 在线观看免费视频你懂的 | 亚洲精品黄色在线观看 | 在线观av | 日韩视频免费在线 | 一区精品在线 | 91香蕉视频在线下载 | 欧美一级久久久久 | 九九久久久久久久久激情 | 久久国产欧美日韩 | 99精品久久精品一区二区 | 国产一区二区午夜 | 久久九九久久精品 | 毛片视频电影 | 99日精品 | 99久高清在线观看视频99精品热在线观看视频 | 久久免费精彩视频 | ,久久福利影视 | 黄色日本片 | 国产精品网站一区二区三区 | 亚洲国产精品小视频 | 91成人黄色| 中文字幕在线观看一区 | 毛片一级免费一级 | 国产精品欧美日韩 | 中文字幕最新精品 | av黄色大片 | 四虎精品成人免费网站 | 国产美女主播精品一区二区三区 | 午夜三级在线 | 五月激情五月激情 | 久久久久久久免费观看 | 色妞色视频一区二区三区四区 | 国产一区二区观看 | 中文字幕乱码日本亚洲一区二区 | 99麻豆久久久国产精品免费 | 亚洲免费在线观看视频 | 精品亚洲在线 | 色悠悠久久综合 | 国产手机av | 8090yy亚洲精品久久 | 91在线麻豆 | 国产伦精品一区二区三区高清 | 96久久| 国产三级av在线 | 日韩a免费| 91重口视频 | 免费91麻豆精品国产自产在线观看 | 久草精品视频 | 97成人在线观看视频 | 日韩视频免费 | 国产一级片一区二区三区 | 97超碰香蕉 | 亚洲综合欧美激情 | 91中文在线视频 | 久久久久久久久久久久国产精品 | 中文字幕久久精品亚洲乱码 | 国产精品美 | 久久这里只有精品视频首页 | 成 人 黄 色 视频免费播放 | 国产资源在线播放 | 99久久影院 | 日韩久久网站 | 中文字幕在线观看播放 | 欧美资源 | 国产一级精品绿帽视频 | 97视频网址 | 久久精品91视频 | 99在线热播精品免费 | 天天干天天操天天射 | 欧美 日韩精品 | 99欧美精品 | 特级毛片网 | 国产亚洲午夜高清国产拍精品 | 久久精品国产99国产 | 久久成人国产精品入口 | 色亚洲网 | 91精品国产高清自在线观看 | 岛国大片免费视频 | 综合色播 | 少妇精品久久久一区二区免费 | 日韩一级片网址 | 日韩,精品电影 | 91入口在线观看 | 国产免费观看高清完整版 | 国产麻豆精品传媒av国产下载 | 五月婷婷色播 | 久久久久久久久久久综合 | 一区二区精品视频 | 国产高清视频在线 | 日韩高清一二三区 | 日本夜夜草视频网站 | 亚洲播放一区 | 中文字幕亚洲五码 | 五月在线 | 香蕉视频久久 | 特级a毛片| 久久国语露脸国产精品电影 | 91精品一区二区三区蜜桃 | 麻豆一区二区 | 在线小视频国产 | 超级碰碰免费视频 | 色偷偷88欧美精品久久久 | 久久人人插 | 精品不卡av | 成年人视频在线 | 国产99久久久国产精品免费看 | 久久99网| 91人人人| 亚洲精品国产精品99久久 | 337p日本欧洲亚洲大胆裸体艺术 | 黄色在线观看网站 | 婷婷激情av | 日本精品久久久久中文字幕 | 国产精品1区2区3区在线观看 | 国产欧美日韩精品一区二区免费 | 欧美日韩在线视频观看 | 91av观看 | aav在线| 高清av免费看 | 国产精品九九九九九 | 最近中文字幕视频完整版 | 国产精品久久久久久久久久久久午夜 | 91久久爱热色涩涩 | 国产不卡视频 | 手机av在线网站 | 精品久久久久久久久久 | 国产精品麻豆一区二区三区 | 国产精品久99 | 黄色三级在线 | 日本中文乱码卡一卡二新区 | 久色小说| 亚洲欧洲精品久久 | 91精品视频在线看 | 色a资源在线 | 91九色国产在线 | 亚洲精品1234区 | 亚洲最新av在线网址 | 亚洲精品在线资源 | 综合久久一本 | 亚洲爱爱视频 | 免费av视屏 | 亚洲综合色播 | 国产精品毛片一区视频播不卡 | 色资源网在线观看 | 热久久最新地址 | 91视频88av| 91激情 | 久久视精品 | 91伊人影院 | 久久伊人精品天天 | 人人干人人草 | 欧美一级片免费播放 | 日本中文在线 | 亚洲成人精品久久 | 人人看人人草 | 成人国产精品久久久春色 | 日韩电影久久 | 国产一区二区在线免费播放 | 最近2019年日本中文免费字幕 | 狠狠操狠狠插 | 香蕉久久久久久av成人 | 久久久久久久久久久黄色 | 精品国产三级 | 亚洲精品国产精品国自产观看 | 天堂av在线7 |