2. •BDD (Agile) has new needs
•What is hamcrest
•What is lambdaj
•Improvement
Agenda
2
3. IN YOUR ZONE
Purpose
3
•http://hamcrest.org
•“Hamcrest it is not a testing library:
it just happens that matchers are
very useful for testing.”
•Matching allows writing of lines that
are close-to natural language
•Anagram of “matchers”
•http://code.google.com/p/lambdaj/
•Access collections without explicit
loops
•Operations include: items
filtering, converting, sorting, method
invoking, concatenate etc.
Hamcrest Lambdaj
4. IN YOUR ZONE
Why Hamcrest
4
•Clarity
•assertThat(a, is(“3”));
•assertEquals(a, “3”);
•Speed
•Not necessarily applicable for isNull() or isNotNull()
•assertThat(list, hasItems(“banana”, “paple”, “papoi”));
5. IN YOUR ZONE
Hamcrest (some of the common matchers)
5
•Core
• is
•Logical
• allOf - like Java &&
• anyOf - like Java ||
• not
•Object
• equalTo - test object equality using Object.equals
• notNullValue, nullValue - test for null
6. IN YOUR ZONE
Hamcrest (some of the common matchers)
6
•Collections
• hasEntry, hasKey, hasValue - test a map contains an entry, key or value
• hasItem, hasItems - test a collection contains elements
•Number
• closeTo - test floating point values are close to a given value
• greaterThan, greaterThanOrEqualTo, lessThan, lessThanOrEqualTo - test ordering
•Text
• equalToIgnoringCase
• containsString, endsWith, startsWith - test string matching
14. IN YOUR ZONE
Why Lambdaj
14
•Readability
•Collections are very common
•Iterating over them is not dead-easy
•Loops are hard to read
•Operations for collections: Convert, Index, Filter, Sort, Extract
etc.
15. IN YOUR ZONE
Lambdaj examples
15
•Mathematical comparisons
•Mathematical operations
23. IN YOUR ZONE
References
23
•Hamcrest
• http://code.google.com/p/hamcrest/wiki/Tutorial
• http://edgibbs.com/junit-4-with-hamcrest/
• http://rafaelnaufal.com/blog/2010/03/15/using-hamcrest-and-junit/ -
writing your own matchers
•LambdaJ
• http://code.google.com/p/lambdaj/
• http://code.google.com/p/lambdaj/wiki/LambdajFeatures
Editor's Notes
There is a new trend in BDD that empowers every member of the team to make changes in the code of the application & testing, starting with how the stories are connected with the code and should also be taken deeper.Hamcrest and lambdaj are 2 such libraries that make the code more human readable and easier to understand.
So why would I want to write assertions like this?ClarityassertThat() is a replacement for the traditionalassertEqual that is focused more on specifications than on BDDFirst one reads: “assert that a is 3”. The second reads “assert equals a (and) 3”SpeedThis is pretty str8 forward: “assert that list contains ‘banana’, ‘paple’, ‘papoi’”
Collections are hard to interrogate, especially when read from an outside source.It is easy to write a loop, but not so very easy to extract things from that loop or perform conversions or other operations on the items in the loop.
You can read this like:select from family items having…last nameequal to `Papoi`
The current implementation of forEach cannot handle null or empty collections – this will just throw an exception.The same is true for a final class that is used with on()On average it is about 2-3 times slower, but depending on the collection it sometimes can be 6 times slower.