本文概览:介绍了Junit和Hamcrest的使用。其中Hamcrest是为了配合Junit中asserThat方法来使用的。
1 Junit
1.1 maven库
1 2 3 4 5 6 |
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.2</version> <scope>test</scope> </dependency> |
1.2 常用注解
如下是五个常用的注解
- @BeforeClass ,后接的方法public staic init(),在所有测试方法前,只跑一次;
- @Before, 后接的方法,public void setup();每个test方法跑之前跑一次
- @Test,要测试的方法,都是public类型
- @After,和@Before对应
- @AfterClass,和@BeforeClass对应
1、@BeforeClass
1 2 3 4 |
@BeforeClass public static void init() { System.setProperty("app.name", "engine"); } |
1.3 常用断言
常用的断言如下:
- Assert.assertEqunal(expected,actual) 比较两个对象是否相等,类似于字符串的equals()方法。
- asserTrue(conditon)查看condition是否为true。为ture时说明成功。
- assertThat(actual,matcher) 在单元测试时我们都是使用这个断言,所以引入了下一节的Hamcrest,Hamcrest就是提供了各种matcher.
1.4 对于异常的两种测试
1、判断异常类型
1 |
@Test(expected = RuntimeException.class) |
2、判断异常message是否正确
1 2 3 4 5 6 |
try{ 执行待测函数; }catch(Exception e){ // 异常信息是否为”faile“。 assertThat(e.getMessage(), is(equalTo("false"))); } |
2 Hamcrest
2.1 介绍
1. 配合junit.Assert.asserThat中来使用的。如下junit.Assert.asserThat中有两个参数,其中一个就是Hamcrest提供的matcher.
1 2 3 |
public static <T> void assertThat(T actual, Matcher<T> matcher) { assertThat("", actual, matcher); } |
2. pom.xml
1 2 3 4 5 |
<dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-all</artifactId> <version>1.3</version> </dependency> |
2.2 经常使用的matcher
包括两个包org.hamcrest.CoreMatchers和org.hamcrest.Matchers
1.org.hamcrest.CoreMatchers
- assertThat( number, allOf( greaterThan(10), lessThan(15) ) ):相当于“与”(&&),即allOf中条件都必须成立
- assertThat( number, anyOf( greaterThan(30), lessThan(1) ) ):相当于“或”(||),即只要anyOf中有一个条件成立就可以了
- assertThat( number, anything() ):无论什么条件,永远为true
- assertThat( string, is( “engine” ) )和assertThat( string, equalTo( expectedValue ) ):两个作用是一样的,只是写法不同,都是Object的equals方法
- assertThat( string, not( “engine” ) ):not匹配符和is匹配符正好相反
2. org.hamcrest.Matchers
(1)字符串相关匹配符
- assertThat( string, containsString( “engine” ) ):包含子字符串”engine”则测试通过
- assertThat( string, endsWith( “engine” ) ):以子字符串”engine”结尾则测试通过
- assertThat( string, startsWith( “engine” ) ):以子字符串”engine”开始则测试通过
- assertThat( testedString, equalToIgnoringCase( “engine” ) ); 忽略大小写的情况
- assertThat( testedString, equalToIgnoringWhiteSpace( “engine” ) ):忽略头尾的任意个空格
- assertThat( string, is( “engine” ) ):判断两个字符串相等
(2)数值相关匹配符
- assertThat( number, closeTo( 10.0, 0.1 ) ):在10.0±0.1范围之内则测试通过
- assertThat( number, greaterThan(11) ):大于11则测试通过
- assertThat( number, lessThan (11) ):小于11则测试通过
- assertThat( number, greaterThanOrEqualTo (11) ):大于等于11则测试通过
- assertThat( number, lessThanOrEqualTo (11) ):小于等于11则测试通过
(3)collection相关匹配符
- assertThat( map, hasEntry( “key”, “value” ) ):mapObject含有一个键值为”key”对应元素值为”value”测试通过
- assertThat( list, hasItem ( “element” ) ):iterableObject含有元素“element”项则测试通过
- assertThat( map, hasKey ( “key” ) ):mapObject含有键值“key”则测试通过
- assertThat( map, hasValue ( “key” ) ):mapObject含有元素值“value”则测试通过
3.代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.assertThat; public class Test{ /** * startWith */ @Test public void testCheckLineLength() { try { String destFilePath = ClassLoader.getSystemResource("file/balance_fail_lineLength.txt") .getFile().toString(); parseFile(destFilePath); } catch (Exception e) { assertThat(e.getMessage(), startsWith("【CommonParser】文件行的长度不合法")); } } /** * is */ @Test public void testCheckFieldFormat() { try { String destFilePath = ClassLoader.getSystemResource("file/balance_fail_fieldFormat.txt") .getFile().toString(); parseFile(destFilePath); } catch (EngineSysException e) { assertThat(e.getMessage(), is("字段不符合定义要求")); } } } |
3 常见问题
1、Junit测试类中获取Spring上下文
直接在测试类,添加一个
1 2 3 |
// 获取Spring上下文 @Autowired private ApplicationContext context; |
举例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:spring/test.xml") public class DemoTest { // 获取Spring上下文 @Autowired private ApplicationContext context; @Test public void test(){ ... } } |
(全文完)