matchers依赖_Hamcrest Matchers教程

matchers依赖

本文是我们名为“ 用Mockito测试 ”的学院课程的一部分。

在本课程中,您将深入了解Mockito的魔力。 您将了解有关“模拟”,“间谍”和“部分模拟”的信息,以及它们相应的存根行为。 您还将看到使用测试双打和对象匹配器进行验证的过程。 最后,讨论了使用Mockito的测试驱动开发(TDD),以了解该库如何适合TDD的概念。 在这里查看 !

在本教程中,我们将研究Hamcrest Matcher库以及如何将其与JUnit和Mockito集成。

目录

1.什么是Hamcrest? 2.包括Hamcrest 3.认识匹配者
3.1。 简单匹配器 3.2。 简单匹配器结合其他匹配器
4。结论

1.什么是Hamcrest?

Hamcrest是用于创建匹配对象的框架。 这些匹配器对象是谓词,用于编写某些条件下可以满足的规则。 它们通常用于自动化测试中,尽管它们可以用于其他情况下,例如数据验证。 Hamcrest让我们超越了简单的JUnit断言,并使我们能够编写非常具体的,易读的验证代码。

Hamcrest旨在使测试更具可读性。 它充分利用静态方法来创建断言语法,该语法易于编写和理解。 当与JUnit和Mockito结合使用时,它使我们能够编写清晰,简洁的测试,从而满足良好的单元测试的特性,即“测试一件事”。

假设我们有一个String,我们想测试它是否与另一个预期的字符串相等,我们可以使用JUnit断言来测试它:

assertEquals(expected, actual);

在Hamcrest中,我们使用JUnit assertThat(valueUnderTest, matcher)方法。 此方法始终构成Hamcrest断言的基础; 我们断言所测试的值满足匹配谓词。 要在最基本的水平上用hamcrest重写上述测试,我们可以编写:

assertThat(actual, equalTo(expected));

注意assertThat约定将被测的实际值作为第一个参数,这与assertEquals约定相反。 这是对可读性的改进,但是Hamcrest还以is()匹配器的形式为我们提供了一些不错的语法糖。 该匹配器本身不执行任何操作,它只是中继其输入匹配器的结果,从而使您的断言代码可以像英语一样读取。 让我们使用is()重写上面的内容:

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

很好,很可读!

Hamcrest的匹配器失败时,它会生成详细的输出,并指定期望值和实际值,以帮助您确定测试失败的原因。 查看以下测试用例:

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

显然,该测试将失败,但是Hamcrest将提供有关失败的详细信息:

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

在本教程中,我们将遵循仅将一个断言作为单元测试一部分的约定。 这似乎是重复的,特别是在许多测试中测试的设置部分相同的情况下,但是这是单元测试中的良好做法。 它使我们能够创建针对性的测试-仅当单个断言失败时,测试才会失败,其他所有断言将继续执行。 它使我们能够创建可读的测试-我们可以一目了然地看到测试的目的。 它使我们能够创建记录代码的测试-我们可以使用表达测试目的的测试名称,从而传达测试的详细目的(请考虑customer_should_have_balance_updated_by_input_order_amount()而不是verifyOrderMethod() )。 它使我们能够创建不易碎的测试–如果测试做得太多,则如果更改了不相关的功能,它可能会中断,从而迫使我们重写测试只是为了使其再次正常工作,而无需更改实际的被测代码。

如果我们遵循“测试一件事”的习惯,我们将在未来编写出更好的单元测试!

2.包括Hamcrest

如果您使用的是Maven,则可以将Hamcrest添加到您的项目中,并且对pom.xml具有以下依赖性

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

如果您使用的是Gradle,请添加以下内容

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

要将hamcrest直接添加到项目的类路径中,您可以从https://code.google.com/p/hamcrest/下载hamcrest-all-1.3.jar到硬盘驱动器上的某个位置。

右键单击您的eclipse项目,然后选择“属性”,然后在左窗格中选择“ Java Build Path”,然后在右侧选择“ Libraries”。

在“库”选项卡上,单击“添加外部Jar”按钮,然后导航到先前下载的所有hamcrest-jar。 选择罐子,它现在已添加到您的项目中并可供使用。

请注意,JUnit与简化版本的Hamcrest(Hamcrest Core)捆绑在一起,因此,如果JUnit在类路径上的Hamcrest之前出现,则编译器将选择该版本。 为了解决这个问题,请确保Hamcrest在类路径上的JUnit之前出现。 您可以在Maven中通过在所有其他依赖项之前列出hamcrest-all依赖项来实现此目的。

与Mockito静态方法一样,我们可以通过启动Window-> Preferences并将Hamcrest库添加到Eclipse内容辅助中,并转到左侧导航栏中的Java / Editor / Content Assist / Favorites。 然后,按照图1添加以下内容作为“ New Type…”

  • org.hamcrest.Matchers

启动Window-> Preferences,然后转到左侧导航栏中的Java / Editor / Content Assist / Favorites。 然后,按照图1添加以下内容作为“ New Type…”

图1-Content Assist收藏夹

图1 – Content Assist收藏夹

3.认识匹配者

Hamcrest提供了一个静态工厂方法库,用于在org.hamcrest.Matchers类中创建Matchers,因此您可以通过静态导入引入所有Matchers

import static org.hamcrest.Matchers.*

但是,如果这样做,则存在命名冲突的风险,因为Hamcrest和Mockito都提供静态的any()方法,因此建议导入您单独使用的每个静态方法。
现在,我们将在Hamcrest Matchers库中查看所有可用的Matchers。 它们将分为两大类: 用于测试值的匹配器(简单),以及用于组合其他匹配器(聚合)的匹配器。

简单匹配器

以下匹配器主要用于测试输入值。

3.1.1。 任何()

匹配给定类型的任何变量。

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

3.1.2。 任何()

匹配任何东西。

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

3.1.3。 arrayContaining()

数组的各种匹配器,数组的长度必须匹配匹配器的数量,并且它们的顺序很重要。

数组是否按照输入到匹配器的顺序包含所有给定项目?

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

数组是否包含按顺序匹配匹配器输入列表的项目?

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

数组是否按顺序包含与输入vararg匹配器匹配的项目?

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

3.1.4。 arrayContainingInAnyOrder()

数组的各种匹配器,数组的长度必须匹配匹配器的数量,但是它们的顺序并不重要。

数组是否包含所有给定项?

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

数组中是否包含与Matchers的输入集合匹配的项目?

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

数组是否包含与输入vararg匹配器匹配的项目?

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

3.1.5。 arrayWithSize()

各种匹配器,用于检查数组是否具有特定长度。

输入数组是否具有指定的长度?

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

输入数组的长度是否与指定的匹配项匹配?

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

3.1.6。 相近()

可以与Double或BigDecimal一起使用的匹配器,以检查某个值是否在期望值的指定误差范围内。

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

大十进制

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

3.1.7。 comparesEqualTo()

创建一个Comparable匹配器,尝试使用输入值的compareTo()方法匹配输入匹配器值。 如果compareTo()方法为输入的匹配器值返回0,则匹配器将匹配,否则将不匹配。

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

3.1.8。 contains()

各种匹配器可用于检查输入Iterable是否包含值。 值的顺序很重要,并且Iterable中的项目数必须与要测试的值数相匹配。

输入列表是否按顺序包含所有值?

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

输入列表中是否包含按顺序匹配输入匹配器列表中所有匹配器的项目?

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

输入列表中是否仅包含与输入匹配项匹配的一项?

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

输入列表中是否包含按顺序匹配输入vararg匹配器中所有匹配器的项?

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

3.1.9。 containsInAnyOrder()

各种匹配器可用于检查输入Iterable是否包含值。 值的顺序并不重要,但是Iterable中的项目数必须与要测试的值数相匹配。

输入列表是否以任何顺序包含所有值?

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

输入列表中是否包含与输入匹配器列表中的所有匹配器按任何顺序匹配的项目?

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

输入列表中是否包含以任何顺序匹配输入vararg匹配器中所有匹配器的项目?

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

3.1.10。 containsString()

如果被测字符串包含给定的子字符串,则匹配的匹配器。

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

3.1.11。 空()

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

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

3.1.12。 emptyArray()

如果输入数组的长度为0,则匹配的匹配器。

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

3.1.13。 emptyCollectionOf()

Typesafe匹配器,如果输入集合为给定类型且为空,则匹配。

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

3.1.14。 emptyIterable()

如果输入Iterable没有值,则匹配的匹配器。

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

3.1.15。 emptyIterableOf()

Typesafe Matcher,如果输入的Iterable没有值且为给定类型,则匹配。

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

3.1.16。 以。。结束()

如果输入String以给定的子字符串结尾,则匹配的匹配器。

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

3.1.17。 等于()

如果输入值在逻辑上等于给定测试值,则匹配的匹配器。 也可以在数组上使用,在这种情况下,它将检查数组的长度并确保输入测试数组中的所有值在逻辑上都等于指定数组的值。

单值。

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

数组。

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

3.1.18。 equalToIgnoringCase()

如果输入的String值等于指定的String而忽略大小写,则匹配的匹配器。

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

3.1.19。 equalToIgnoringWhiteSpace()

如果输入的String值等于指定的String而不匹配多余的空格,则匹配该匹配器。 忽略所有前导和尾随空格,并将所有剩余空格折叠为单个空格。

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

3.1.20。 eventFrom()

如果输入EventObject来自给定Source,则匹配的Matcher。 也可以接受指定子类型的EventObeject

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

指定子类型。

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

3.1.21。 比...更棒()

如果输入测试值大于指定值,则匹配的匹配器。

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

3.1.22。 GreaterThanOrEqual()

如果输入测试值大于或等于指定值,则匹配的匹配器。

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

3.1.23。 hasEntry()

如果给定映射包含与指定键和值匹配的条目,则匹配器或匹配器。

实际值

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

匹配器

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

3.1.24。 hasItem()

如果输入Iterable具有至少一项与指定值或匹配器匹配的项,则匹配器。

实际价值

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

匹配器

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

3.1.25。 hasItemInArray()

如果输入数组具有至少一个与指定值或匹配器匹配的项目,则匹配的匹配器。

实际价值

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

匹配器

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

3.1.26。 hasItems()

如果输入Iterable具有任意顺序的所有指定值或匹配器,则匹配的匹配器。

实际值

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

匹配器

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

3.1.27。 hasKey()

如果输入Map具有至少一个与指定值或匹配项匹配的键,则匹配的匹配项。

实际价值

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

匹配器

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

3.1.28。 hasProperty()

如果输入对象满足Bean约定并且具有具有指定名称的属性,并且该属性的值可选地与指定的匹配器匹配的匹配器。

物业名称

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

属性名称和值匹配器

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

3.1.29。 hasSize()

如果输入Collection具有指定的大小,或者它的大小与指定的匹配器匹配,则匹配器。
实际价值

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

匹配器

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

3.1.30。 hasToString()

如果输入对象的toString()方法匹配指定的String或输入匹配器,则匹配的匹配器。

正常价值

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

匹配器

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

3.1.31。 hasValue()

如果输入Map具有至少一个与指定值或匹配器匹配的值,则匹配的匹配器。

实际价值

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

匹配器

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

3.1.32。 hasXPath()

如果输入XML DOM节点满足输入XPath表达式,则匹配的匹配器。

节点是否包含与输入XPath表达式匹配的节点?

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

节点是否包含与输入XPath表达式匹配的节点,并且该节点的值是否与指定的匹配器匹配?

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

节点是否在指定的名称空间中包含与输入XPath表达式匹配的节点?

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

该节点是否在指定的名称空间中包含一个与输入XPath表达式匹配的节点,并且该节点的值是否与指定的匹配器匹配?

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

3.1.33。 instanceOf()

如果输入对象是给定类型,则匹配器。

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

3.1.34。 isEmptyOrNullString()

当输入字符串为空或null时匹配的匹配器。

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

3.1.35。 isEmptyString()

当输入字符串为空时匹配的匹配器。

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

3.1.36。 isIn()

当在给定的Collection或Array中找到输入项时匹配的匹配器。

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

3.1.37。 是其中之一()

当输入对象是给定对象之一时匹配的匹配器。

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

3.1.38。 iterableWithSize()

当输入Iterable具有指定大小时匹配或与指定大小匹配器匹配的匹配器。

实际价值

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

匹配器

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

3.1.39。 少于()

匹配器,使用compareTo方法匹配输入对象小于指定值的可比较对象。

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

3.1.40。 lessThanOrEqualTo()

匹配器,使用compareTo方法匹配输入对象小于或等于指定值的可比较对象。

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

3.1.41。 不()

包裹现有匹配器并反转其匹配逻辑的匹配器

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

当与值而不是匹配器一起使用时,也是not(equalTo(...))的别名

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

3.1.42。 notNullValue()

当输入值不为null时匹配的匹配器。

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

3.1.43。 nullValue()

当输入值为null时匹配的匹配器。

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

3.1.44。 sameInstance()

当输入对象与指定值相同的实例时匹配的匹配器。

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

3.1.45。 samePropertyValuesAs()

当输入Bean具有与指定Bean相同的属性值时匹配的匹配项,即,如果被测Bean上具有属性,则它们必须存在,并且具有与在测试条件中指定的Bean相同的值。

给定以下Java类:

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

我们可以编写以下测试:

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

3.1.46。 以。。开始()

如果输入字符串以给定前缀开头的匹配项。

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

3.1.47。 stringContainsInOrder()

匹配器,如果输入的String包含给定的Iterable中的子字符串,则按从Iterable返回的顺序进行匹配。

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

3.1.48。 theInstance()

当输入对象与指定值相同的实例时匹配的匹配器。 行为与“ sameInstance()”相同

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

3.1.49。 typeCompatibleWith()

当输入类型的对象可以分配给指定基本类型的引用时匹配的匹配器。

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

简单匹配器结合其他匹配器

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

3.2.1。 所有的()

当所有输入Matchers都匹配时匹配的Matcher的行为类似于逻辑AND。 可以使用单个Matchers或Iterable Matchers。

个人匹配器

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

匹配器的迭代

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

3.2.2。 任何()

当任何输入匹配器匹配时匹配的匹配器,其行为类似于逻辑或。 可以使用单个Matchers或Iterable Matchers。

个人匹配器

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

匹配器的迭代

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

3.2.3。 array()

当输入数组的元素分别使用指定的Matchers依次进行匹配时匹配的Matcher。 匹配器的数量必须等于数组的大小。

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

3.2.4。 都()

匹配器,当与它的可组合匹配器.and()结合使用时,将在两个指定匹配器匹配时匹配。

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

3.2.5。 要么()

匹配器,当与它的可组合匹配器.or()结合使用时,如果指定的匹配器匹配,则匹配器。

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

3.2.6。 is()

当输入匹配器匹配时匹配的匹配器,只是为了方便起见,使断言更像英语。

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

也用作is(equalTo(...))的别名,类似于not(...)not(equalTo(...))

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

3.2.7。 被描述成()

匹配器,用于覆盖另一个匹配器的失败输出。 在需要自定义故障输出时使用。 参数是失败消息,原始Matcher,然后是将使用占位符%0,%1,%2格式化为失败消息的任何值。

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

4。结论

现在,我们访问了Hamcrest中定义的所有Matchers,并看到了每个匹配器的实例。 库中有很多非常有用且功能强大的Matchers,尤其是当彼此结合使用时。 但是有时候我们需要做的比现有的还要多。 在下一个教程中,我们将研究如何创建自己的自定义Matchers,以扩展Hamcrest并使它更加有用!

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

matchers依赖

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

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

相关文章

谷歌开源替代 C++ 的编程语言:Carbon

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删谷歌工程师 Chandler Carruth 近日在多伦多举办的 CppNorth 大会上宣布①&#xff0c;正式开源谷歌内部打造的编程语言&#xff1a;Carbon&#…

C语言灵魂拷问:++i为何比i++执行效率高!有何区别?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删背景相信很多人遇到过这样的问题&#xff1a;printf("%d,%d",i,i);也纠结过这个问题&#xff0c;到底答案是什么。确没有一个参考的资…

指标实现层级_企业如何构建核心指标系统,实现业务运营效率提升90%?

本文为帆软数据生产力大赛获奖案例&#xff0c;未经授权禁止转载。01企业简介西安怡康医药连锁有限责任公司成立于2001年&#xff0c;总部设在西安市大庆路副24号,是一家由零售连锁药店发展起来的大型医药连锁企业&#xff0c;除药品零售外&#xff0c;同时兼营药品批发与器械批…

学生时代,你有遇到过像我这样理解C语言的吗?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删今天我讲一下我个人对C语言的认识以及自己的理解&#xff0c;若有错误&#xff0c;还望指出&#xff0c;不甚感激。首先是C语言整体的脉络&#…

scrapyd部署_第八章 第一节 scrapyd和scrapy-client

如果觉得文章对您产生帮助的话, 欢迎关注Python开发之路(微信公众号: python-developer), 及时获取更多教程假设有我们做了一个项目是抓取很多网站(每个网站对应一个爬虫), 需要分别部署到不同的服务器上(单台扛不住), scrapy官方也提供了一种部署工具scrapyd。这个工具是用来将…

C++ 首超 Java,与 Python、C语言共角逐年度最佳编程语言奖!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删最新的 TIOBE 12 月编程语言已发布&#xff0c;先来预测一波今年的年度编程语言大奖究竟会花落谁家吧&#xff1f;C 首超 Java和上个月相比&…

乔安监控云存储能存多长时间_干货 | 监控磁盘阵列知识介绍,不了解还不来看看?...

一、磁盘阵列的概念要定义磁盘阵列的概念&#xff0c;是一个简单的工作&#xff0c;因为这个概念已经形成了共识——磁盘阵列(DiskArray)是由一个硬盘控制器来控制多个硬盘的相互连接&#xff0c;使多个硬盘的读写同步&#xff0c;减少错误&#xff0c;增加效率和可靠度的技术。…

我要是在学习 C 语言之前知道这些就好了!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删对于我来说&#xff0c;学习 C 语言好难啊。这门语言本身的基础知识并不是很难&#xff0c;但是“用 C 语言编程”需要用到各种知识&#xff0c;…

opencv yuv保存本地_OpenCV-dlib-python3实现人脸戴墨镜和含Y的抖音效果

1 说明&#xff1a;1.1 吸烟有害健康&#xff01;&#xff01;纯属娱乐和学习python的相关知识。1.2 虽然是娱乐&#xff0c;但是opencv、dlib和python在人工智能、人脸识别、自动化等有很大作用&#xff0c;目前已经或者未来会有更多的应用&#xff0c;作为一名普通人&#xf…

为什么永远不会有语言取代 C/C++?

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络数以百计的 C/C 替代品将会出现&#xff0c;但 C/C 将永远与我们同在&#xff01;每个 CPU 都带有一种称为 ISA&#xff08;指…

qt 表格中插入一行_在EXCEL表格中,快速插入多行、多列的技巧

在使用Excel过程中&#xff0c;我们会遇到需要插入相同格式的多行或多列&#xff0c;如果一行行或一列列的插入&#xff0c;对于插入的数量较少的情况还是适用的。可是如果需要插入上百的行或列&#xff0c;使用此方法就比较费时费力啦。分享几个小技巧实现快速插入多行或多列.…

amber 口译_口译员设计模式示例

amber 口译本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff…

别再自己瞎写工具类了,SpringBoot内置工具类应有尽有,建议收藏!!

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络断言断言是一个逻辑判断&#xff0c;用于检查不应该发生的情况Assert 关键字在 JDK1.4 中引入&#xff0c;可通过 JVM 参数-en…

ad转换器工作原理_AD转换中参考电压的作用

AD转换AD转换就是模数转换。顾名思义&#xff0c;就是把模拟信号转换成数字信号。主要包括积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型、电容阵列逐次比较型及压频变换型。A/D转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号&…

面试大全 | C语言高级部分总结

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络一、内存大话题1.0、内存就是程序的立足之地&#xff0c;体现内存重要性。1.1、内存理解&#xff1a;内存物理看是有很多个Ban…

ideal pom文件安装到maven库中_java学习之web基础(14)Maven基础学习

maven介绍Maven 是一个项目管理工具&#xff0c;它包含了一个项目对象模型 (POM&#xff1a; Project Object Model)&#xff0c;一组标准集合&#xff0c;一个项目生命周期(Project Lifecycle)&#xff0c;一个依赖管理系统(Dependency Management System)&#xff0c;和用来运…

戴尔集群监控与管理系统_监控与管理

戴尔集群监控与管理系统本文是我们名为“ EAI的Spring集成 ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0…

三位数除以两位数竖式计算没有余数_苏教四上期末复习——两、三位数除以两位数...

期末复习读万卷书 &#xff1c;做一好题第二单元两、三位数除以两位数计算能力1、竖式计算5106740961700262914246829810132、简便方法计算150253810(92)560353、填空720秒( )分300分( )时336时( )日调商1、小李计算一道除法是两位数的除法算式&#xff0c;商是12&#x…

单例模式示例_单例设计模式示例

单例模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

解读C++即将迎来的重大更新(一):C++20的四大新特性

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络C20&#xff08;C 编程语言标准 2020 版&#xff09;将是 C 语言一次非常重大的更新&#xff0c;将为这门语言引入大量新特性。…