150 java testing junit hamcrest junit4
当我查看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
Run Code Online (Sandbox Code Playgroud)
比方说,我没有看到一个很大的优势assertEquals( 0, 1 )
.
如果构造变得更复杂但是你看到更多的优点,那么对于消息可能很好吗?可读性?
Joa*_*uer 170
assertFoo
存在与您的意图完全匹配的存在的情况没有大的优势.在这些情况下,他们的行为几乎相同.
但是当你来检查更复杂的检查时,优势就变得更加明显:
assertTrue(foo.contains("someValue") && foo.contains("anotherValue"));
Run Code Online (Sandbox Code Playgroud)
与
assertThat(foo, hasItems("someValue", "anotherValue"));
Run Code Online (Sandbox Code Playgroud)
可以讨论哪一个更易于阅读,但是一旦断言失败,您将从中获得良好的错误消息assertThat
,但只能获得非常少量的信息assertTrue
.
assertThat
会告诉你断言是什么以及你得到了什么.assertTrue
只会告诉你,你到达了false
预期的位置true
.
Igo*_*pov 39
基本上是为了增加代码的可读性.
除了hamcrest,你也可以使用fest断言.它们比hamcrest有一些优点,例如:
assertEquals(123, actual); // reads "assert equals 123 is actual"
vsassertThat(actual).isEqualTo(123); // reads "assert that actual is equal to 123")
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));
Run Code Online (Sandbox Code Playgroud)
Fest不再活跃,而是使用AssertJ.
And*_*vis 18
一个非常基本的理由是很难搞乱新语法.
假设测试后特定值foo应为1.
assertEqual(1, foo);
Run Code Online (Sandbox Code Playgroud)
- 要么 -
assertThat(foo, is(1));
Run Code Online (Sandbox Code Playgroud)
使用第一种方法,很容易忘记正确的顺序,并向后键入它.然后,而不是说测试失败,因为它预期1并得到2,消息是倒退的.测试通过时不成问题,但在测试失败时可能导致混淆.
对于第二个版本,几乎不可能犯这个错误.
例:
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!
Run Code Online (Sandbox Code Playgroud)
顺便说一下:你也可以在assertXXX中写文字......