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リポジトリをスローするために利用できる実装はありますか?
現在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")));
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>
一部のオブジェクトのオプションフィールドが存在する/存在しないことを確認するだけの場合は、次のイディオムを使用できます。
期待されるオブジェクト:
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)))
));
これが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())));