有没有用于java.util.Optional的Hamcrest Matcher?

2022-09-02 04:04:07

我正在寻找一个Hamcrest Matcher来单元测试方法,返回java.util.Optional类型。像这样:

    @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())));
    }

是否有任何可用的实现抛出 Maven 存储库?


答案 1

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

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

我是Hamcrest Optional的作者,它现在可以在Maven central上找到。

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

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

答案 2

来自Narendra Pathai的Hamcrest Optional确实做得很好。

import static com.github.npathai.hamcrestopt.OptionalMatchers.isEmpty;
import static com.github.npathai.hamcrestopt.OptionalMatchers.isPresent;
import static com.github.npathai.hamcrestopt.OptionalMatchers.isPresentAnd;
import static com.github.npathai.hamcrestopt.OptionalMatchers.isPresentAndIs;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
  @Test
  public void testOptionalValue() {
    Optional<String> option = Optional.of("value");
    assertTrue(option.isPresent()); // the old-fashioned, non-diagnosable assertion
    assertThat(option, isPresent());
    assertThat(option, isPresentAndIs("value"));
    assertThat(option, isPresentAnd(startsWith("v")));
    assertThat(option, isEmpty()); // fails
  }

上面的最后一个断言失败并产生很好的可诊断消息:

java.lang.AssertionError: 
Expected: is <Empty>
     but: had value "value"

在 Maven 上可用 :

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

推荐