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依赖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8255编程c语言程序,51单片机8255驱动C程序

/*----------------------------------------------------------------------------------------------------------------库文件名称:driver8155.h功能描述:驱动8155,不需要了解8255的工作原理,透明操作8255的三个输入输出口PA、…

如何编写更少,更好的代码,或Project Lombok

我长期以来一直打算撰写有关Lombok项目的文章 ,以至于每当一个自重的Java开发人员都已经听说过它时,我可能会写它。 尽管如此,值得一提的是,如果只是提醒自己,不要犹豫,尝试性能增强工具并查看它们是否合适…

c语言ue,小话C语言中的cotinue和break

#includeint fun(){ printf("fun\n");return 1;}int main(int argc,char *argv[]){int c0;printf("please input your num ,case 3 to break\n");do{scanf("%d",&c);switch(c){case 0:break; /*这里的break只会跳出swtich*/case 1:continue;…

c语言 at指令,学渣求指教,如何识别字符串中的AT命令并逐个输出,求程序!!!...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Topic – to implement a parser to retrieve AT command line and print out (1) the tokensone by one and (2) the elapse time of each command line (processing).Please submit the solution in 48 hours.- The solution cou…

defender 删除_Java 8中的默认方法(Defender方法)简介

defender 删除我们都知道Java中的接口仅包含方法声明,而没有实现,并且任何实现该接口的非抽象类都必须提供实现。 让我们看一个例子: public interface SimpleInterface {public void doSomeWork(); }class SimpleInterfaceImpl implements …

江西财经研究生834c语言试卷,江西财经大学2006年考研C语言程序设计试题(B卷)

1、给定一个数X,判断它至少能被3,5,7中的两个数整除的表达式。(5分)某学生今年学习5门课程,其考试成绩为:X1、X2、X3、X4、X5.请写出该同学符合三好学生学习成绩的表达式。(5分)3、a,b,c为三条边…

JAX-RS 2.1的Jersey客户端依赖性

泽西岛是JAX-RS 2.1的参考实现。 为了在企业容器外部运行具有JSON-P和JSON-B映射的JAX-RS 2.1客户端&#xff0c;需要以下Jersey依赖项。 Jersey客户端2.6版实现了JAX-RS 2.1 API。 以下依赖性将客户端运行时添加到项目中&#xff1a; <dependency><groupId>org.…

1到10用递归c语言,为什么这个递归能输出1到10

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼首先你的main函数调用printN&#xff0c;作为调用者他会做这么几件事1.将参数10压栈&#xff1b;2.将Return Address压栈&#xff0c;即第19行的地址&#xff1b;3.跳转到函数体&#xff1b;在函数体中&#xff0c;作为被调用者他会…

Android 画布画线,android实现一个简单的画布,可以用手指画线条。

满意答案wpdhc2016.07.05采纳率&#xff1a;49% 等级&#xff1a;7已帮助&#xff1a;359人public class DrawView extends View {Context mycontext;int toasttime 1000*60;boolean enabletoast true;//之前的坐标float preX;float preY;//路径private Path path;//画笔p…

camel 数据库_使用Camel在来自不同来源的Solr中索引数据

camel 数据库Apache Solr是建立在Lucene之上的“流行的&#xff0c;快速的开源企业搜索平台”。 为了进行搜索&#xff08;并查找结果&#xff09;&#xff0c;通常需要从不同的源&#xff08;例如内容管理系统&#xff0c;关系数据库&#xff0c;旧系统&#xff09;中提取数据…

android手机连接windows,Windows PC连接Android adb shell的方法

今天突发奇想&#xff0c;想用跟笔记本连接的键鼠操作自己的安卓设备(具体操作先挖个坑之后再填)。首先遇到的问题就是&#xff0c;如何用Windows PC连接自己的安卓设备&#xff0c;因为笔者的笔记本的USB接口有限&#xff0c;又有多部安卓设备&#xff0c;还想同时对多部Andro…

对状态代码使用JAX-RS异常

从JAX-RS资源发送特定HTTP&#xff08;错误&#xff09;状态代码的一种方法是使用javax.ws.rs.core.Response类及其类似Builder Pattern的API。 如果要根据响应主体指定返回类型&#xff0c;则仍然可以这样做&#xff0c;并通过抛出WebApplicationException针对错误发送不同的状…

设置html文字居中自动换行,CSS怎么设置文字自动换行?

CSS怎么设置文字自动换行&#xff1f;下面本篇文章就给大家介绍css设置文字(特别是连续的数字和英文)自动换行的方法。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你们有所帮助。关于换行问题&#xff0c;正常字符的换行是比较合理的&#xff0c;…

html霓虹灯效果图,HTML5 SVG+CSS3霓虹灯文字边框动画特效

【实例简介】【实例截图】【核心代码】使用SVG CSS实现动态霓虹灯文字效果#svgBox{[/b] width:100%;margin:100px auto;}.text{font-size: 64px;font-weight: bold;text-transform: uppercase;fill: none;stroke-width: 2px;stroke-dasharray: 90 310;animation: stroke 6s inf…

动态生成的html元素无法调用js函数,如何确保动态生成的div在js函数被调用之前被加载到DOM中?...

$("#submitB").click(function() {$.post("/previewproposal", $("#proposal-form").serialize(), function(data){$.colorbox({html:data});}, "html");});呈现的HTML是这样的&#xff1a;$(document).ready(function(){function plo…

lambdas for_Java 8 Lambdas –缺少脱离Java的链接

lambdas for我学习了函数式编程&#xff0c;但是后来我决定我更喜欢命令式编程&#xff0c;于是我转回去。 —没人 从命令式编程过渡到函数式编程是当今非常普遍的事情。 互联网上的博客文章充斥着关于它的证词。 我读过的所有内容以及与我交谈过的每个人&#xff08;包括我自…

吉林省2021高考成绩排名查询,2021年吉林高考成绩排名查询系统,吉林高考位次排名表...

最近好多家长和考生留言&#xff0c;希望知道&#xff1a;吉林高考位次是什么&#xff1f;吉林高考位次与名次的区别&#xff1f;如何根据位次选大学&#xff1f;2020年吉林高考位次就是指考生高考成绩在全省同类考生中的位置。高考位次主要分为三大类&#xff1a;省市位次、区…

Picocli 2.0:类固醇上的Groovy脚本

Picocli 2.0增加了对其他JVM语言&#xff08;尤其是Groovy&#xff09;的支持。 当Groovy语言具有CliBuilder类的内置CLI支持时&#xff0c;为什么要使用picocli&#xff1f; 您可能会喜欢picocli的使用帮助&#xff0c;默认情况下会显示ANSI 颜色和样式 。 您可能喜欢的另一个…

angular字符串转成html,详解angular如何调用HTML字符串的方法

详解angular如何调用HTML字符串的方法前面的文章我们介绍过angular6.0的数据绑定&#xff0c;也就是前面页面如何调用后台的数据&#xff0c;我们接触到了调用普通数据——如&#xff1a;调用产品详情{{post.content}}。在使用中&#xff0c;我们会发现&#xff0c;如果按原来的…

西南交大计算机几个专业,西南交通大学计算机科学与技术专业

西南交通大学计算机科学与技术专业计算机科学与技术专业解读计算机科学与技术专业我校早在60年代初就创办了计算机技术专业&#xff0c;是全国较早设立该专业的高等学校之一。1978年由中科院院士曹建猷教授等主持恢复开办计算机科学及应用专业&#xff0c;1981年在国内首批获得…