JUnit学习笔记(1)----AssertThat

アサーション 値を比較検証する

1. Assertによる値の比較検証

  • org.junit.Assertクラスは、JUnitで値の比較を行うための基本クラスです。

  • アサーションメソッドは、staticインポートを利用することを想定したstaticメソッドです。このように、自然言語に近い表記を実現する。

    例えば:

    staticインポートを使わずに記述すると次のようになります:

Assert.assertThat(3+4,CoreMatchers.is(7));

   一方、staticインポートを利用すると、次のようになります:

assertThat(3+4,is(7));
  • assertThatメソッドは、型パラメータを持つメソッドで、2つの引数を持ちます。1つ目の引数は実測値を指定し、2つ目の引数には期待値との比較を行うMatcherオブジェクトを指定します。
  • assertThatメソッドは、Matcherオブジェクトによる比較検証で値が一致しない場合、AssertionErrorを送り出します。AssertionErrorはテストが失敗したことをフレームワークに通知する例外クラスです。

2. Matcher APIによるアサーションの特徴

  • 先ほど解説したように、MatcherオブジェクトはMatcher APIにより提供されます。
  • Matcher APIは、「何らかの値に対して等価であるかを柔軟に比較検証する」ためのAPIです。
  • なお、JUnitにMatcher APIが導入される前までは、次のように2つの値を比較し一致するがを検証するアサーションでした。
    assertEquals(dxpected,actual);
    ps:assertEqualsメソッドでは、1つ目の引数が期待値であり、2つ目の引数が実測値です。assertThatメソッドと逆である点に注意してください。

  • 柔軟な比較
    単純な等価性のチェックでは厳密過ぎる場合や、独自ロジックで比較検証を行いたい場合もあります。このような場合、Matcher APIを利用することで、可読性を損ねず、再利用可能で柔軟な比較検証を行うことができます。
    例えば、テスト対象メソッドも戻り値がString Listであり、「リストの任意の位置に文字列”Hello”が含まれていること」を検証したいとします。
    Matcher APIを使わないと、次のように記述できます。
List<String> actual = sut.getList();
assertTrue(actual.contains("hello"));

Matcher APIを使うと、次のように記述できます。

List<String> actual = sut.getList();
assertThat(actual,hasItems("Hello"));

3.CoreMatchersが提供するMatcher

// allOf: 所有条件都必须满足,相当于&&  
    assertThat("myname", allOf(startsWith("my"), containsString("name")));  
    // anyOf: 其中一个满足就通过, 相当于||  
    assertThat("myname", anyOf(startsWith("na"), containsString("name")));  
    // both: &&  
    assertThat("myname", both(containsString("my")).and(containsString("me")));  
    // either: 两者之一  
    assertThat("myname", either(containsString("my")).or(containsString("you")));  
    // everyItem: 每个元素都需满足特定条件  
    assertThat(Arrays.asList("my", "mine"), everyItem(startsWith("m")));  
    // hasItem: 是否有这个元素  
    assertThat(Arrays.asList("my", "mine"), hasItem("my"));  
    // hasItems: 包含多个元素  
    assertThat(Arrays.asList("my", "mine", "your"), hasItems("your", "my"));  
    // is: is(equalTo(x))或is(instanceOf(clazz.class))的简写  
    assertThat("myname", is("myname"));  
    assertThat("mynmae", is(String.class));  
    // anything(): 任何情况下,都匹配正确  
    assertThat("myname", anything());  
    // not: 否为真,相当于!  
    assertThat("myname", is(not("you")));  
    // nullValue(): 值为空  
    String str = null;  
    assertThat(str, is(nullValue()));  
    // notNullValue(): 值不为空  
    String str2 = "123";  
    assertThat(str2, is(notNullValue()));  


    // 字符串匹配  
    // containsString:包含字符串  
    assertThat("myname", containsString("na"));  
    // stringContainsInOrder: 顺序包含,“my”必须在“me”前面  
    assertThat("myname", stringContainsInOrder(Arrays.asList("my", "me")));  
    // endsWith: 后缀  
    assertThat("myname", endsWith("me"));  
    // startsWith: 前缀  
    assertThat("myname", startsWith("my"));  
    // isEmptyString(): 空字符串  
    assertThat("", isEmptyString());  
    // equalTo: 值相等, Object.equals(Object)  
    assertThat("myname", equalTo("myname"));  
    assertThat(new String[] {"a", "b"}, equalTo(new String[] {"a", "b"}));  
    // equalToIgnoringCase: 比较时,忽略大小写  
    assertThat("myname", equalToIgnoringCase("MYNAME"));  
    // equalToIgnoringWhiteSpace: 比较时, 首尾空格忽略, 比较时中间用单个空格  
    assertThat(" my \t name ", equalToIgnoringWhiteSpace(" my name "));  
    // isOneOf: 是否为其中之一  
    assertThat("myname", isOneOf("myname", "yourname"));  
    // isIn: 是否为其成员  
    assertThat("myname", isIn(new String[]{"myname", "yourname"}));  
    // toString() 返回值校验  
    assertThat(333, hasToString(equalTo("333")));  


    // 数值匹配  
    // closeTo: [operand-error, operand+error], Double或BigDecimal类型  
    assertThat(3.14, closeTo(3, 0.5));  
    assertThat(new BigDecimal("3.14"), is(closeTo(new BigDecimal("3"), new BigDecimal("0.5"))));  
    // comparesEqualTo: compareTo比较值  
    assertThat(2, comparesEqualTo(2));  
    // greaterThan: 大于  
    assertThat(2, greaterThan(0));  
    // greaterThanOrEqualTo: 大于等于  
    assertThat(2, greaterThanOrEqualTo(2));  
    // lessThan: 小于  
    assertThat(0, lessThan(2));  
    // lessThanOrEqualTo: 小于等于  
    assertThat(0, lessThanOrEqualTo(0));  



    // 集合匹配  
    // array: 数组长度相等且对应元素也相等  
    assertThat(new Integer[]{1, 2, 3}, is(array(equalTo(1), equalTo(2), equalTo(3))));  
    // hasItemInArray: 数组是否包含特定元素  
    assertThat(new String[]{"my", "you"}, hasItemInArray(startsWith("y")));  
    // arrayContainingInAnyOrder, 顺序无关,长度要一致  
    assertThat(new String[]{"my", "you"}, arrayContainingInAnyOrder("you", "my"));  
    // arrayContaining:  顺序,长度一致  
    assertThat(new String[]{"my", "you"}, arrayContaining("my", "you"));  
    // arrayWithSize: 数组长度  
    assertThat(new String[]{"my", "you"}, arrayWithSize(2));  
    // emptyArray: 空数组  
    assertThat(new String[0], emptyArray());  
    // hasSize: 集合大小  
    assertThat(Arrays.asList("my", "you"), hasSize(equalTo(2)));  
    // empty: 空集合  
    assertThat(new ArrayList<String>(), is(empty()));  
    // isIn: 是否为集合成员  
    assertThat("myname", isIn(Arrays.asList("myname", "yourname")));  
   // Map匹配  
    Map<String, String> myMap = new HashMap<String, String>();  
    myMap.put("name", "john");  
    // hasEntry: key && value匹配  
    assertThat(myMap, hasEntry("name", "john"));  
    // hasKey: key匹配  
    assertThat(myMap, hasKey(equalTo("name")));  
    // hasValue: value匹配  
    assertThat(myMap, hasValue(equalTo("john")));  
}  

4.org.hamcrest.Matchersを利用するとSecurityExceptionが発生する問題

  • java.lang.SecurityException: class “org.hamcrest.Matchers“‘s signer informat…

  • 原因:
    Junit4ライブラリに含まれる org.hamcrest.core_xxx.jar と、hamcrest-1.3-all.jarが競合したため。

  • 解決方法:
    Junit.jarを抜いて、次のライブラリを導入する。
    这里写图片描述


JUnit里面的jar包详解:

  • junit和hamcrest是两个不同的框架,不同的东西。只不过是junit使用了hamcrest框架而已。
  • JUnit里面的jar包:

    junit-4.10.jar:包含junit-dep-4.10.jar全部内容和必要的harmcres的包
    junit-4.10-src:是源代码,但不包含org.harmcres.*相关的源代码(在图中temp.hamcrest.source中)
    junit-dep-4.10.jar:是junit的包,不含harmcres的相关的类,import此包还需引入harmcres相关的包

  • hamcrest里的jar包

    hamcrest-all-1.3.ORC2.ajr:几乎包含所有的hamctest的类(没有验证过)
    hamcrest-core-1.3.ORC2.jar:hamcrest的核心包,使用hamcrest框架必须引入的包。(junit官方给的包就包含了该包)
    hamcrest-library-1.3.ORC2.jar:包含各种断言,补充hamcrest core包中的断言

  • 使用是导入包的方案:junit.jar + hamcrest-core.jar + hamcrest-library.jar
    或者是:junit-dep.ajr+hancrest-all.jar

  • 这两种导入方法虽然尽量避免了导入重复的包,但使用时还是遇到了冲突。查看包中各类和文档后发现有些类(例如:断言is())同时出现在了org.hamcrest.Mathchers和org.hamcrest.core中,则在用到时候引入的时候需要注意。

  • 现在尝试过的导入方式还是如上图所示是最不容易冲突的方式。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值