首页 > 其他 > 详细

hamcrest和mockito的冲突(转)

时间:2015-12-01 23:09:41      阅读:1673      评论:0      收藏:0      [点我收藏+]

assertThat

JUnit4.4引入了Hamcrest框架,Hamcest提供了一套匹配符Matcher,这些匹配符更接近自然语言,可读性高,更加灵活

/**equalTo匹配符断言被测的testedValue等于expectedValue, * equalTo可以断言数值之间,字符串之间和对象之间是否相等,相当于Object的equals方法 */ assertThat(testedValue, equalTo(expectedValue));

/**equalToIgnoringCase匹配符断言被测的字符串testedString *在忽略大小写的情况下等于expectedString */ assertThat(testedString, equalToIgnoringCase(expectedString));

/**equalToIgnoringWhiteSpace匹配符断言被测的字符串testedString *在忽略头尾的任意个空格的情况下等于expectedString, *注意:字符串中的空格不能被忽略 */ assertThat(testedString, equalToIgnoringWhiteSpace(expectedString);

/**containsString匹配符断言被测的字符串testedString包含子字符串subString**/ assertThat(testedString, containsString(subString) );

/**endsWith匹配符断言被测的字符串testedString以子字符串suffix结尾*/ assertThat(testedString, endsWith(suffix));

/**startsWith匹配符断言被测的字符串testedString以子字符串prefix开始*/ assertThat(testedString, startsWith(prefix));

 

/**nullValue()匹配符断言被测object的值为null*/ assertThat(object,nullValue());

/**notNullValue()匹配符断言被测object的值不为null*/ assertThat(object,notNullValue());

/**is匹配符断言被测的object等于后面给出匹配表达式*/ assertThat(testedString, is(equalTo(expectedValue)));

/**is匹配符简写应用之一,is(equalTo(x))的简写,断言testedValue等于expectedValue*/ assertThat(testedValue, is(expectedValue));

/**is匹配符简写应用之二,is(instanceOf(SomeClass.class))的简写, *断言testedObject为Cheddar的实例 */ assertThat(testedObject, is(Cheddar.class));

/**not匹配符和is匹配符正好相反,断言被测的object不等于后面给出的object*/ assertThat(testedString, not(expectedString));

/**allOf匹配符断言符合所有条件,相当于“与”(&&)*/ assertThat(testedNumber, allOf( greaterThan(8), lessThan(16) ) );

/**anyOf匹配符断言符合条件之一,相当于“或”(||)*/ assertThat(testedNumber, anyOf( greaterThan(16), lessThan(8) ) );

/**closeTo匹配符断言被测的浮点型数testedDouble在20.0¡À0.5范围之内*/ assertThat(testedDouble, closeTo( 20.0, 0.5 ));

/**greaterThan匹配符断言被测的数值testedNumber大于16.0*/ assertThat(testedNumber, greaterThan(16.0));

/** lessThan匹配符断言被测的数值testedNumber小于16.0*/ assertThat(testedNumber, lessThan (16.0));

/** greaterThanOrEqualTo匹配符断言被测的数值testedNumber大于等于16.0*/ assertThat(testedNumber, greaterThanOrEqualTo (16.0));

/** lessThanOrEqualTo匹配符断言被测的testedNumber小于等于16.0*/ assertThat(testedNumber, lessThanOrEqualTo (16.0));

/**hasEntry匹配符断言被测的Map对象mapObject含有一个键值为"key"对应元素值为"value"的Entry项*/ assertThat(mapObject, hasEntry("key", "value" ) );

/**hasItem匹配符表明被测的迭代对象iterableObject含有元素element项则测试通过*/ assertThat(iterableObject, hasItem (element));

/** hasKey匹配符断言被测的Map对象mapObject含有键值“key”*/ assertThat(mapObject, hasKey ("key"));

/** hasValue匹配符断言被测的Map对象mapObject含有元素值value*/ assertThat(mapObject, hasValue(value));

http://0411.iteye.com/blog/1048303

 
1.JUnit4.4引入了Hamcrest框架,Hamcest提供了一套匹配符Matcher,这些匹配符更接近自然语言,可读性高,更加灵活;
2.使用全新的断言语法:assertThat,结合Hamcest提供的匹配符,只用这一个方法,就可以实现所有的测试;
3.assertThat语法如下:
    assertThat(T actual, Matcher<T> matcher);
    assertThat(String reason, T actual, Matcher<T> matcher);
    其中actual为需要测试的变量,matcher为使用Hamcrest的匹配符来表达变量actual期望值的声明;
4.注意事项:
    a.必须导入JUnit4.4之后的版本才能使用assertThat方法;
    b.不需要继承TestCase类,但是需要测试方法前必须加“@Test”。
    c.需要导入Hamcrest类库:hamcrest-core-1.3.0RC2.jar  |   hamcrest-library-1.3.0RC2.jar
 
3、使用assertThat
a)         assertThat( n, allOf( greaterThan(1), lessThan(15) ) );
assertThat( n, anyOf( greaterThan(16), lessThan(8) ) );
assertThat( n, anything() );
assertThat( str, is( "bjsxt" ) );
assertThat( str, not( "bjxxt" ) );

b)        assertThat( str, containsString( "bjsxt" ) );
assertThat( str, endsWith("bjsxt" ) ); 
assertThat( str, startsWith( "bjsxt" ) ); 
assertThat( n, equalTo( nExpected ) ); 
assertThat( str, equalToIgnoringCase( "bjsxt" ) ); 
assertThat( str, equalToIgnoringWhiteSpace( "bjsxt" ) );

c)         assertThat( d, closeTo( 3.0, 0.3 ) );
assertThat( d, greaterThan(3.0) );
assertThat( d, lessThan (10.0) );
assertThat( d, greaterThanOrEqualTo (5.0) );
assertThat( d, lessThanOrEqualTo (16.0) );

d)        assertThat( map, hasEntry( "bjsxt", "bjsxt" ) );
assertThat( iterable, hasItem ( "bjsxt" ) );
assertThat( map, hasKey ( "bjsxt" ) );
assertThat( map, hasValue ( "bjsxt" ) );

http://kinglixing.blog.51cto.com/3421535/748879

 

现在测试驱动开发已经是主流,大多数主流的技术平台都把更好的支持单元测试作为吸引开发者的一个要件。Java里自然不例外。JUnit似乎已经够好了,但是还是有人觉得它的断言部分太难用,表达起来不顺畅,所以就有了Hamcrest。不幸的时JUnit 4.11之前的版本和不太hamcrest合作,它只内置了一个更旧的hamcrest和单独hamcrest包经常起冲突。典型症状是:

Java代码  
  1. java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V  
  2.     at org.hamcrest.core.IsCollectionContaining.matchesSafely(IsCollectionContaining.java:31)  
  3.     at org.hamcrest.core.IsCollectionContaining.matchesSafely(IsCollectionContaining.java:14)  
  4.     at org.hamcrest.TypeSafeDiagnosingMatcher.matches(TypeSafeDiagnosingMatcher.java:55)  
  5.     at org.hamcrest.core.AllOf.matches(AllOf.java:24)  
  6.     at org.springframework.test.util.MatcherAssertionErrors.assertThat(MatcherAssertionErrors.java:62)  
  7.     at org.springframework.test.web.servlet.result.ModelResultMatchers$1.match(ModelResultMatchers.java:56)  
  8.     at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:148)  
  9.       

 后来JUnit 4.11做出了正确的决定,不在内置hamcrest,而是利用包管理工具来声明对相应hamcrest的依赖。这样就彻底消除class文件的新旧版本冲突问题。

Mockito是个很有用的mock对象生成工具,很多单元测试使用mock对象可以事半功倍。所以Mockito的出现给广大码农带来了福音。不过你要和hamcrest合用,那么上面的类文件冲突又要找到上门来了。原因还是mockito-all早期版本捆绑了hamcrest。以下JUnit,Hamcrest和Mockito版本组合是兼容的:

  • JUnit 4.11
  • hamcrest-core 1.3
  • mockito-core 1.10.19

为方便懒人,附上Gradle的依赖声明:

Groovy代码  技术分享
  1. testCompile "junit:junit:4.11"  
  2. testCompile "org.mockito:mockito-core:1.10.19"  

hamcrest-core1.3是JUnit 4.11自动依赖的,Gradle能够识别这样所谓传递式依赖(transive depedency),所以没有必要声明hamcrest-core。

 

最后,作为总结,在一个模块化的世界里,作为一个类库的开发者,请不要捆绑发布你无法控制的依赖,因为你往往无法跟上上游版本的节奏,但是使用者却很可能需要更新的上游版本。

http://schnell18.iteye.com/blog/2175274

hamcrest和mockito的冲突(转)

原文:http://www.cnblogs.com/softidea/p/5011527.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!