`

关于hamcrest断言的不足

阅读更多
hamcrest断言提供了很多好用的断言表达式,参见http://0411.iteye.com/blog/1048303

我最感兴趣的是对集合中Bean属性的断言,相信这也是最具实用的断言,可见hamcrest偏偏在这方面做得很弱啊,以下是我的一断测试代码:

    @Test
    public void testNotSeniorQuery() throws Exception {
        List<ParsedQueryParam> parsedQueryParams = queryParamParser.parse(request);
        assertThat(parsedQueryParams, notNullValue());
        assertThat(parsedQueryParams, hasSize(6));
        assertThat(parsedQueryParams,
                   hasItem(hasProperty("aaa",is("a"))));
    }


  以上代码直接通不过编译,具体解决方法参见:
https://weblogs.java.net/blog/johnsmart/archive/2008/04/on_the_subtle_u.html
  也即,以上测试代码必须改成:
    @Test
    public void testNotSeniorQuery() throws Exception {
        List parsedQueryParams = queryParamParser.parse(request);//这儿直接用List
        assertThat(parsedQueryParams, notNullValue());
        assertThat(parsedQueryParams, hasSize(6));
        assertThat((List<Object>)parsedQueryParams,  //这儿将List cast 为List<Object>
                   hasItem(hasProperty("aaa",is("a"))));
    }


   虽然这样可以通过编译了,但是我还有更多类似于以下的断言集合中Bean级联属性的需求:
即ParsedQueryParam类包含了一个QueryParam,QueryParam中拥有paramName及paramValue属性,我希望hamcrest能够支持以下的代码:
    @Test
    public void testNotSeniorQuery() throws Exception {
        List parsedQueryParams = queryParamParser.parse(request);
        assertThat(parsedQueryParams, notNullValue());
        assertThat(parsedQueryParams, hasSize(6));

        assertThat((List<Object>)parsedQueryParams,
                hasItem(hasProperty("queryParam.paramName",is("userId1"))));//失败,无法正确断言!!
    }


   可是这样无法成功运行,报如下错误:
引用

java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
at org.hamcrest.core.IsCollectionContaining.matchesSafely(IsCollectionContaining.java:31)
at org.hamcrest.core.IsCollectionContaining.matchesSafely(IsCollectionContaining.java:14)
at org.hamcrest.TypeSafeDiagnosingMatcher.matches(TypeSafeDiagnosingMatcher.java:55)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:12)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
at com.hsit.euler.eqengine.query.parser.impl.QueryParamParserImplTest.testNotSeniorQuery(QueryParamParserImplTest.java:64)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
at org.testng.internal.MethodInvocationHelper$1.runTestMethod(MethodInvocationHelper.java:200)
at org.unitils.UnitilsTestNG.run(UnitilsTestNG.java:103)


   此路不通,我就试着换成如下方式:
    @Test
    public void testNotSeniorQuery() throws Exception {
        List parsedQueryParams = queryParamParser.parse(request);
        assertThat(parsedQueryParams, notNullValue());
        assertThat(parsedQueryParams, hasSize(6));

        assertThat((List<Object>)parsedQueryParams,
                hasItem(hasProperty("queryParam",hasProperty("paramName"))));//这样可以成功断言!

    }

   但是以上断言只是断言属性的存在性,如果我断言属性值,即又歇菜了!
    @Test
    public void testNotSeniorQuery() throws Exception {
        List parsedQueryParams = queryParamParser.parse(request);
        assertThat(parsedQueryParams, notNullValue());
        assertThat(parsedQueryParams, hasSize(6));

        assertThat((List<Object>)parsedQueryParams,
                hasItem(hasProperty("queryParam",hasProperty("paramName",is("userId1")))));//NND 这样不行!

    }


   一直想找一个可以很好对集合中Bean进行存在性断言或Bean属性值断言的框架,发现hamcrest很让人失望啊。不知列位有没有好的建议,非常感谢!
分享到:
评论
4 楼 zhanhb 2015-06-30  
使用jdk8
3 楼 wxx_xinxin 2014-01-26  
如果 hamcest 提供方法不能满足的你的需求,自己实现一个类

写个class 去继承 BaseMatcher 
2 楼 wxx_xinxin 2014-01-26  
assertThat(
(List<User>) users,
IsCollectionContaining.<User> hasItem(allOf(
hasProperty("status", is(0)),
hasProperty("name", equalTo("Steve")))));



我简单做了一个性能的比较 ;

如果判断对象是个结果集
1百万条数据

目标数据在中间靠后的位置
原始的for循环要快7倍左右甚至更多。
1 楼 jinnianshilongnian 2013-12-29  
断言属性值相等性 我这边是可以的啊
        List<User> userlist = new ArrayList<>();
        User user1 = new User();
        user1.setId(1L);
        user1.setName("zhang");

        User user2 = new User();
        user2.setId(2L);
        user2.setName("admin");
        user2.setUser2(user2);

        userlist.add(user1);
        userlist.add(user2);

        assertThat((List<Object>)(List)userlist, hasItem(
                hasProperty("user2", hasProperty("name", is("admin")))
        ));


不过使用spring的BeanWrapper很快就能改造一个 
https://github.com/zhangkaitao/spring4-showcase/tree/master/spring-mvc-test/src/test/java/com/sishuok/matcher

相关推荐

    Hamcrest测试断言SwiftHamcrest.zip

    SwiftHamcrest 是用 Swift 编写的 Hamcrest 测试断言。

    test-hamcrest:Java中的hamcrest断言匹配器库的示例

    hamcrest库Matcher库的简单示例 安装(Maven) 最新版本1,3:2012年7月 &lt;groupId&gt;org.hamcrest &lt;artifactId&gt;hamcrest-all &lt;scope&gt;test &lt;version&gt;1.3 没有依赖 匹配的演示文稿 第一次比赛 String s = "a ...

    hamcrest-core-1.3.rc2.jar,hamcrest-library-1.3.jar、

    支持Junit测试,简单实用,只需要添加即可,hamcrest-library-1.3.jar包是hamcrest的核心包,这个jar包主要用于补充hamcrest core包中的断言,导入后就可以正常开发使用了,主要适用于eclipse中的JUnit4测试操作,...

    JUnit4.0 JUnit4 HelloWorld

    放弃旧的断言,使用hamcrest断言 运行多个测试 注意 1. 遵守约定,比如: a) 类放在test包中 b) 类名用XXXTest结尾 c) 方法用testMethod命名

    junit4.8.1+hamcrest-1.3.0RC2

    开发junit4所用到的3个jar包,可用最新断言assertThat,包括了hamcrest-core-1.3.0RC2.jar, hamcrest-library-1.3.0RC2.jar和 junit-4.8.1.jar三个jar包

    SwiftHamcrest:针对Swift的Hamcrest测试断言

    迅捷的Hamcrest Hamcrest为您提供高级匹配器,并为您的Swift单元测试提供更好的错误消息。 Hamcrest最初是用Java编写的,可用于。教程该教程也可以作为Hamcrest工作区中的Playground使用。 通常,您在单元测试中使用...

    junit4hamcrest jar包

    assertThat断言语句 Marchers提供各种数值匹配方法、字符串匹配方法使用

    java-test-assertions-comparison:java测试断言库的比较(assertj、hamcrest、fest、truth...)

    junit-断言-比较junit 断言库的比较(assertj、hamcrest、fest、truth...)junit 断言库概述图书馆网站断言J 节 哈姆克雷斯特 真相 # 语法和失败消息比较简单等于图书馆句法失败信息朱尼特assertEquals(expected, ...

    hamcrest-vs-assertj

    hamcrest-vs-assertj 断言库的一般优势 提高可读性 更好的失败信息 提供自定义匹配器 提供常见的断言模式 AssertJ 的优点 简单性和可用性 积极开发和社区驱动( ) 很多例子( ) 流利的api 高可读性 有意义的...

    smog:对象图的稀疏匹配-Hamcrest的扩展

    将一个Hamcrest断言添加到每个测试中,这些断言声明实际的结果对象图与预期的对象图匹配。 如果任何一个属性都不匹配,则断言将失败,并显示一条消息,使您可以轻松地确定对象图中哪个或哪些属性不匹配以及它们的...

    shazamcrest, 适用于自动化测试的可以重用Hamcrest匹配器.zip

    shazamcrest, 适用于自动化测试的可以重用Hamcrest匹配器 Shazamcrest'Shazamcrest'是...通过serialising的实际和预期 bean,可以简化关于完整bean的断言,并将两者进行比较。 诊断程序正在利用ide的比较功能,比如 Ecl

    junit4-r4.12.tar.gz

    hamcrest框架必须引入的包, 使用是导入包的方案:junit.jar + ...查看包中各类和文档后发现有些类(例如:断言is())同时出现在了org.hamcrest.Mathchers和org.hamcrest.core中,则在用到时候引入的时候需要注意。

    java_ui_auto:Java中带有Selenium和Hamcrest的UI自动化框架

    Java UI自动化框架Java中带有Selenium和Hamcrest的UI自动化框架该项目是Java中的基本UI... 使用的工具是: 用TestNG写测试用例Selenium与Chrome浏览器进行交互Hamcrest写断言该项目包含页面对象模型(POM)设计模式。

    java8集合源码-cirneco:基于JUnit和Hamcrest的Java单元测试扩展

    此外,我们喜欢易于阅读和简洁的代码,其中方法名称已经嵌入了解释假设/断言所需的所有语义。 因此,在 Cirneco 中,我们旨在扩展最有价值的单元测试工具包,以提供更好的开发体验。 当前版本 ( Cirneco 2.0.0 ) 仅...

    dbflute-hamcrest:DBFlute 的测试支持库

    DBFlute Hamcrest 这是 DBFlute 的测试支持库,可帮助您从数据库中释放单元测试。 它提供 ConditionBean 匹配器、模拟行为的实用程序和一些 JUnit 帮助器。特征ConditionBean 匹配器断言查询条件 import static org....

    unittest-training

    在为响应编写断言时,我们使用Hamcrest匹配器。 朱尼特我们需要排除hamcrest-core依赖性,因为我们已经添加了hamcrest-all依赖性。 Mockito(mockito核心)。 我们使用Mockito作为我们的模拟库。 Spring测试...

    auderis-test-extra:JUnitHamcrest测试环境的有用补充

    对JUnit / Hamcrest / JUnitParams测试环境的有用补充。 您将大大减少大多数单元测试样板: 测试用例可以接收各种类型的参数,视需要而定。 测试断言几乎是完全人类可读的,从而为测试对象提供了自然的约束 ...

    JavaHamcrest源码 可用来灵活创建意图(intent)表达式的匹配器

    JavaHamcrest是一个专为单元测试设计的校验框架,其核心在于能够组合创建各类灵活的匹配器以进行断言。这个框架与JUnit集成使用,提供了诸如startsWith(字符串开头匹配)、containsString(是否包含指定字符串)和...

    JUnit_01.zip

    JUnit4视频教程及源码,由于文件较大,分割为JUnit_01.zip,JUnit_02.zip,JUnit_03.zip三个压缩包并附文档,下载后解压便可观看视频,导入代码,直接在自己的机器上运行

    JUnit_03.zip

    JUnit4视频教程及源码,由于文件较大,分割为JUnit_01.zip,JUnit_02.zip,JUnit_03.zip三个压缩包并附文档,下载后解压便可观看视频,导入代码,直接在自己的机器上运行

Global site tag (gtag.js) - Google Analytics