Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有用于java.util.Optional的Hamcrest匹配器?_Java_Unit Testing_Optional_Matcher_Hamcrest - Fatal编程技术网

是否有用于java.util.Optional的Hamcrest匹配器?

是否有用于java.util.Optional的Hamcrest匹配器?,java,unit-testing,optional,matcher,hamcrest,Java,Unit Testing,Optional,Matcher,Hamcrest,我正在寻找返回java.util.Optional类型的单元测试方法的Hamcrest匹配器。比如: @Test public void get__Null(){ Optional<Element> element = Element.get(null); assertThat( sasi , isEmptyOptional()); } @Test public void get__GetCode

我正在寻找返回java.util.Optional类型的单元测试方法的Hamcrest匹配器。比如:

    @Test
    public void get__Null(){

        Optional<Element> element = Element.get(null);      
        assertThat( sasi , isEmptyOptional());
    }

    @Test
    public void get__GetCode(){

        Optional<Element> element = Element.get(MI_CODE);       
        assertThat( sasi , isOptionalThatMatches(allOf(hasproperty("code", MI_CODE),
                                                       hasProperty("id",   notNullValue())));
    }
@测试
public void get__Null(){
可选元素=element.get(null);
断言(sasi,IsEmptyoOptional());
}
@试验
public void get\uuu GetCode(){
可选元素=元素.get(MI_代码);
资产(sasi,isOptionalThatMatches)(allOf(hasproperty(“代码”),MI_代码),
hasProperty(“id”,notNullValue());
}

Maven存储库中有可用的实现吗?

目前我有以下信息:

  • 在hamcrest网站上有一个和一个建议,用其他Java 8类型来支持它
  • 一个用户创建了一个,并在他的网站上发布了一个例子。仍然没有在Maven上发布,但正在开发

目前,Java Hamcrest正在使用1.6版本,并与许多使用旧版本Java的项目集成

因此,与Java 8相关的功能将添加到与Java 8兼容的未来版本中。建议的解决方案是拥有一个支持它的扩展库,以便任何需要的人都可以使用扩展库

我是的作者,现在可以在Maven central上找到

示例:检查可选项是否包含以某个值开头的字符串

import static com.github.npathai.hamcrestopt.OptionalMatchers.hasValue;
import static org.hamcrest.Matchers.startsWith;

Optional<String> optional = Optional.of("dummy value");
assertThat(optional, hasValue(startsWith("dummy")));
import static com.github.npatai.hamcrestopt.OptionalMatchers.hasValue;
导入静态org.hamcrest.Matchers.startsWith;
Optional Optional=Optional.of(“伪值”);
资产(可选,hasValue(以“虚拟”开头);

直到它进入Hamcrest,或者如果您无法添加外部库。如果您可以添加一个类,下面将为一个空的可选

class EmptyOptionalMatcher<T> extends BaseMatcher<Optional<T>> {

    private Optional<T> optionalActual;

    public EmptyOptionalMatcher() {
    }

    @Override
    public boolean matches(Object item) {
        optionalActual = (Optional<T>) item;

        if (optionalActual == null) {
            return false;
        }

        boolean empty = !optionalActual.isPresent();
        return empty;
    }

    @Override
    public void describeTo(Description description) {
        description.appendText("optional is empty");
    }

    @Override
    public void describeMismatch(Object item, Description description) {
        if (optionalActual == null) {
            description.appendText(" optional was NULL?");
        } else {
            description.appendText(" was: " + optionalActual.get());
        }
    }

}
或阴性测试为

assertThat(someOptional, is(not(emptyOptional())));

纳伦德拉·帕泰的Hamcrest选装件确实做得很好

import static com.github.npatai.hamcrestopt.OptionalMatchers.isEmpty;
导入静态com.github.npatai.hamcrestopt.OptionalMatchers.isPresent;
导入静态com.github.npatai.hamcrestopt.optionalmachers.isPresentAnd;
导入静态com.github.npatai.hamcrestopt.optionalmachers.isPresentAndIs;
导入静态org.hamcrest.Matchers.startsWith;
导入静态org.junit.Assert.assertThat;
导入静态org.junit.Assert.assertTrue;
@测试
public void testOptionalValue(){
可选选项=可选。of(“值”);
assertTrue(option.isPresent());//老式的、不可诊断的断言
断言(选项,isPresent());
资产(期权,即“价值”);
资产(期权,以“v”开头);
assertThat(option,isEmpty());//失败
}
上面的最后一个断言失败,并生成良好的可诊断消息:

java.lang.AssertionError: 
Expected: is <Empty>
     but: had value "value"
java.lang.AssertionError:
预期:是吗
但是:有价值“价值”
Maven上提供:

<dependency>
  <groupId>com.github.npathai</groupId>
  <artifactId>hamcrest-optional</artifactId>
  <version>2.0.0</version>
  <scope>test</scope>
</dependency>

com.github.npatai
hamcrest可选
2.0.0
测试

如果只想验证某个对象的可选字段是否存在,可以使用以下习惯用法:

预期对象:

public class BusinessObject {
    private Long id;
    private String name;
    private Optional<AnotherObject> anotherObject;
}

为什么不直接使用
equalTo(…)
?还有其他方法来测试对象。但在某些情况下,匹配器会让我们的生活更轻松。例如,当您只想检查一些字段时,断言一个对象有一个带有可选属性的bean,该属性带有一个值。或者如果相等值有一些特殊的实现。我不太了解您的情况,但可能这个库c我可以帮助你:
<dependency>
  <groupId>com.github.npathai</groupId>
  <artifactId>hamcrest-optional</artifactId>
  <version>2.0.0</version>
  <scope>test</scope>
</dependency>
public class BusinessObject {
    private Long id;
    private String name;
    private Optional<AnotherObject> anotherObject;
}
assertThat("BusinessObject is not as expected", businessObject, allOf(
                hasProperty("id", equalTo(1L)),
                hasProperty("name", equalTo("Some title")),
                hasProperty("anotherObject", hasProperty("present", equalTo(true)))
        ));