web-dev-qa-db-ja.com

Java.util.Optional用のHamcrestMatcherはありますか?

Java.util.Optional型を返す単体テストメソッドへのHamcrestMatcherを探しています。何かのようなもの:

    @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リポジトリをスローするために利用できる実装はありますか?

13
borjab

現在Java Hamcrestは1.6バージョンを使用しており、古いバージョンのJavaを使用する多くのプロジェクトと統合されています。

したがって、Java 8に関連する機能は、Java 8互換の将来のバージョンで追加される予定です。提案されたソリューションは、それをサポートする拡張ライブラリを持つことでした。必要な人は誰でも拡張ライブラリを使用できるようにします。

私は Hamcrestオプション の作成者であり、Mavenセントラルで利用できるようになりました。

例:オプションに値で始まる文字列が含まれているかどうかの確認

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")));
8
Narendra Pathai

今のところ、私は次の情報を持っています:

  • issuefeature の提案があり、hamcrestサイトで他のJava 8タイプでサポートします。
  • あるユーザーが作成し、例として彼の GitHub に投稿しました。まだMavenではありませんが、作業中です。
2
borjab

NarendraPathaiのHamcrestOptionalは確かに素晴らしい仕事をします。

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
  }

上記の最後のアサーションは失敗し、Niceの診断可能なメッセージを生成します。

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>
2
Jan Dolejsi

一部のオブジェクトのオプションフィールドが存在する/存在しないことを確認するだけの場合は、次のイディオムを使用できます。

期待されるオブジェクト:

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)))
        ));
1
Andreas Gelever

これが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())));
1
Deepak