【发布时间】:2011-11-30 21:36:17
【问题描述】:
我想将 hamcrest 用作糖框架以在 if 语句中使用,而不是在带有断言的单元测试中,而是在原始生产代码中。
类似
if ( isNotEmpty(name) ) return //....
或
if ( isEqual(name, "John")) return //...
就像AssertThat 但没有抛出错误,只是返回布尔值。
是否可以?
【问题讨论】:
我想将 hamcrest 用作糖框架以在 if 语句中使用,而不是在带有断言的单元测试中,而是在原始生产代码中。
类似
if ( isNotEmpty(name) ) return //....
或
if ( isEqual(name, "John")) return //...
就像AssertThat 但没有抛出错误,只是返回布尔值。
是否可以?
【问题讨论】:
这只是 Java,您可以选择使用它来做什么。 Hamcrest homepage 说:
提供一个匹配器对象库(也称为约束或谓词),允许以声明方式定义“匹配”规则,以便在其他框架中使用。典型场景包括测试框架、模拟库和 UI 验证规则。
注意:Hamcrest 它不是一个测试库:碰巧匹配器对测试非常有用。
还有 a page on the other frameworks 使用 Hamcrest。
【讨论】:
bool project 提供以下语法:
if(the(name, is(equalTo("Alex")))) {
...
}
【讨论】:
您可以使用任何Matcher 实例的matches(value) 方法。
if (equalTo("John").matches(name)) { ... }
为了提高可读性,请创建您自己的类似于assertThat 的辅助方法。
public static <T> boolean checkThat(T actual, Matcher<? super T> matcher) {
return matcher.matches(actual);
}
...
if (checkThat(name, equalTo("John"))) { ... }
如果您想出一个比checkThat 更好的名称,例如ifTrueThat,请在评论中添加。 :)
【讨论】:
按照大卫的回答,我们目前正在这样做,我们的辅助方法被命名为“the()”。这导致代码如下:
if(the(name, is(equalTo("John")))) {...}
最后会有点 lisp-y,但即使对客户来说也非常易读。
【讨论】: