2011-11-30 37 views
11

我想使用hamcrest作为糖框架在if语句中使用,而不是在使用断言的单元测试中使用,但在原始生产代码中使用。任何方式在生产代码中使用Hamcrest匹配器?

喜欢的东西

if (isNotEmpty(name)) return //.... 

if (isEqual(name, "John")) return //... 

就像AssertThat,但没有引发错误,只是返回布尔值。 这可能吗?

回答

4

有提供以下语法bool project

if(the(name, is(equalTo("Alex")))) { 
... 
} 
+0

哇,这真是令人印象深刻! – Vitamon

+1

恕我直言,布尔项目是一个简单的方法“the”有点矫枉过正。尽管它提供了更多的匹配器,但这些只是Hamcrest的重复(比如allOf,anyOf,无论是等等) – Jonas

5

这只是Java,它取决于你选择如何处理它。所述Hamcrest homepage说:

提供匹配的对象允许将声明性地定义“匹配”的规则,在其他框架中使用的库(也称为约束或谓词)。典型的场景包括测试框架,模拟库和UI验证规则。

注:Hamcrest它不是一个测试库:它只是碰巧匹配器是用于测试非常有用的。

还有使用Hamcrest的a page on the other frameworks

+0

同意,我只需要工作的例子,如何使用的匹配不assertThat – Vitamon

5

您可以使用任何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"))) { ... } 

如果你拿出一个比如ifTrueThatcheckThat一个更好的名字,请在注释中添加。 :)

5

跟随大卫的答案,我们目前正在做这个,我们的帮手方法被命名为“()”。这导致了如下代码:

if(the(name, is(equalTo("John")))) {...} 

它获取在最后有点口齿不清-Y,反而使得即使客户很可读。

相关问题