【问题标题】:Any way to use Hamcrest matchers in production code?有什么方法可以在生产代码中使用 Hamcrest 匹配器?
【发布时间】:2011-11-30 21:36:17
【问题描述】:

我想将 hamcrest 用作糖框架以在 if 语句中使用,而不是在带有断言的单元测试中,而是在原始生产代码中。

类似

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

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

就像AssertThat 但没有抛出错误,只是返回布尔值。 是否可以?

【问题讨论】:

    标签: java hamcrest


    【解决方案1】:

    这只是 Java,您可以选择使用它来做什么。 Hamcrest homepage 说:

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

    注意:Hamcrest 它不是一个测试库:碰巧匹配器对测试非常有用

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

    【讨论】:

    • 同意,我只需要一个工作示例,如何在没有 assertThat 的情况下使用匹配器
    【解决方案2】:

    bool project 提供以下语法:

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

    【讨论】:

    • 哇,这真是令人印象深刻!
    • 恕我直言 bool 项目对于一个简单的方法“the”来说有点矫枉过正。尽管它提供了额外的匹配器,但这些只是 Hamcrest 匹配器的副本(如 allOf、anyOf、everyOf、both 等)
    【解决方案3】:

    您可以使用任何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,请在评论中添加。 :)

    【讨论】:

      【解决方案4】:

      按照大卫的回答,我们目前正在这样做,我们的辅助方法被命名为“the()”。这导致代码如下:

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

      最后会有点 lisp-y,但即使对客户来说也非常易读。

      【讨论】:

        猜你喜欢
        • 2015-01-07
        • 2018-04-06
        • 2012-01-29
        • 1970-01-01
        • 1970-01-01
        • 2013-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多