java assertthat用法 - 為什麼要使用Hamcrest-Matcher和assertThat()而不是傳統的assertXXX() - 方法




4 Answers

對於存在與您的意圖完全匹配的assertFoo情況,沒有什麼大的優勢。 在這些情況下,他們的表現幾乎相同。

但是當你來檢查更複雜的東西時,這個優勢就變得更加明顯:

assertTrue(foo.contains("someValue") && foo.contains("anotherValue"));

assertThat(foo, hasItems("someValue", "anotherValue"));

我們可以討論其中哪一個更容易閱讀,但是一旦斷言失敗,就會從assertThat得到一個很好的錯誤信息,但是assertThat只有極少量的信息。

斷言這將告訴你什麼是斷言,你取而代之。 assertTrue只會告訴你,你在預期為true地方有false

core junit

當我查看Assert類JavaDoc中的示例時

assertThat("Help! Integers don't work", 0, is(1)); // fails:
// failure message:
// Help! Integers don't work
// expected: is <1> 
// got value: <0>
assertThat("Zero is one", 0, is(not(1))) // passes

我沒有看到一個很大的優勢,比方說assertEquals( 0, 1 )

如果結構變得更加複雜但是你看到更多的優勢,那麼也許對於這些消息來說很好? 可讀性?




基本上是為了提高代碼的可讀性

除了hamcrest,你還可以使用fest斷言 。 他們比hamcrest一些優勢,例如:

  • 他們更可讀
    assertEquals(123, actual); // reads "assert equals 123 is actual" vs
    assertThat(actual).isEqualTo(123); // reads "assert that actual is equal to 123")
  • 它們是可發現的( 您可以使用任何IDE自動完成工作 )。

一些例子

import static org.fest.assertions.api.Assertions.*;

// common assertions
assertThat(yoda).isInstanceOf(Jedi.class);
assertThat(frodo.getName()).isEqualTo("Frodo");
assertThat(frodo).isNotEqualTo(sauron);
assertThat(frodo).isIn(fellowshipOfTheRing);
assertThat(sauron).isNotIn(fellowshipOfTheRing);

// String specific assertions
assertThat(frodo.getName()).startsWith("Fro").endsWith("do")
                           .isEqualToIgnoringCase("frodo");

// collection specific assertions
assertThat(fellowshipOfTheRing).hasSize(9)
                               .contains(frodo, sam)
                               .excludes(sauron);


// map specific assertions (One ring and elves ring bearers initialized before)
assertThat(ringBearers).hasSize(4)
                       .includes(entry(Ring.oneRing, frodo), entry(Ring.nenya, galadriel))
                       .excludes(entry(Ring.oneRing, aragorn));

2016年10月17日更新

節日不再活躍,請使用AssertJ代替。




例:

assertThat(5 , allOf(greaterThan(1),lessThan(3)));
//  java.lang.AssertionError:
//  Expected: (a value greater than <1> and a value less than <3>)
//       got: <5>
assertTrue("Number not between 1 and 3!", 1 < 5 && 5 < 3);
//  java.lang.AssertionError: Number not between 1 and 3!
  1. 你可以使你的測試更具體
  2. 如果測試失敗,則會得到更詳細的異常
  3. 更容易閱讀測試

順便說一句:你也可以在assertXXX中寫文本...




有斷言的優點assertEquals -
1)更具可讀性
2)關於失敗的更多信息
3)編譯時間錯誤 - 而不是運行時錯誤
4)寫作測試條件的靈活性
5)便攜 - 如果你使用的是hamcrest,你可以使用jUnit或TestNG作為底層框架。




Related

java testing junit junit4 hamcrest