是否有用于java.util.Optional的Hamcrest匹配器?
我正在寻找返回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
@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上发布,但正在开发
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)))
));