如何为所有重要的测试库编写匹配器?

时间:2013-03-29 10:38:46

标签: testing jvm matcher hamcrest

我目前正在扩展Degraph以检查是否违反了依赖规则。

到目前为止,我已经为ScalaTest创建了匹配器,因为这是我最喜欢的JVM测试库。但许多其他人更喜欢或不得不使用其他库。所以我想为那些提供匹配器(或任何适当的等价物)。

另一方面,我很懒,所以我不想为每个可以设想的图书馆提供匹配。

所以问题是:

是否有某种匹配库可以在所有(或最多/多个)测试库中使用?或者也许是一个将Hamcrest匹配器转换为所有其他库的匹配器的包装器?

我想支持的图书馆(按照重要性顺序):

  • JUnit的
  • ScalaTest
  • 最流行的Groovy测试库
  • 最受欢迎的Clojure测试库
  • Specs2
  • TestNG的

1 个答案:

答案 0 :(得分:1)

  1. 我见过的每个单元测试框架都会因为抛出异常的测试而失败。
  2. 如果assertThat(T value, Matcher<T> matcher)返回AssertionError,Hamcrest matcher.matches(value)会抛出false
  3. 因此,Hamcrest应该与大多数测试框架一起开箱即用。对于其他库,例如构建模拟对象,您需要本机使用Hamcrest的Matcher对象或编写集成层。一种方法是创建一个装饰任何匹配器的方法,例如*,

    ArgumentMatcher<T> decorate(final Matcher<T> matcher) {
        return new ArgumentMatcher() {
            public boolean <T> accepts(T value) {
                return matcher.matches(value);
            }
        }
    }
    

    *这是一个使用理论模拟API的人为例子。