java.util.Optional有没有Hamcrest Matcher?

时间:2016-06-08 13:25:08

标签: java unit-testing optional matcher hamcrest

我正在寻找一个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存储库?

5 个答案:

答案 0 :(得分:6)

目前,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")));

答案 1 :(得分:2)

目前我有以下信息:

  • 有一个issue和一个feature提案,可以在hamcrest网站上使用Java 8类型来支持它。
  • 一位用户创建了一位并在GitHub上发布了一个例子。仍然不是在Maven上,而是在努力。

答案 2 :(得分: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>

答案 3 :(得分:1)

直到进入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());
        }
    }

}

然后使用可导入和使用的静态方法使用匹配器帮助程序或公共类:

public static <T> Matcher<? super Optional<T>> emptyOptional() {
    return new EmptyOptionalMatcher<>();
}

用法:

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

或阴性测试为

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

答案 4 :(得分:1)

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

预期对象:

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

Hamcrest测试看起来像这样:

assertThat("BusinessObject is not as expected", businessObject, allOf(
                hasProperty("id", equalTo(1L)),
                hasProperty("name", equalTo("Some title")),
                hasProperty("anotherObject", hasProperty("present", equalTo(true)))
        ));