27. #JavalandJavaslang @koenighotzePainting by Gustav Courbet
java.lang.UnsupportedOperationException at
java.util.Collections$UnmodifiableCollection
.add(Collections.java:1055)
at java.util.stream.AbstractPipeline.<init>
(AbstractPipeline.java:203)
at java.util.stream.ReferencePipeline.<init>
(ReferencePipeline.java:94)
37. #JavalandJavaslang @koenighotzePainting by Gustav Courbet
java.lang.IllegalStateException:
stream has already been operated
upon or closed
at java.util.stream.AbstractPipeline.<init>
(AbstractPipeline.java:203)
at java.util.stream.ReferencePipeline.<init>
(ReferencePipeline.java:94)
57. #JavalandJavaslang @koenighotze
Fixing the Pile of Shame
User user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
58. #JavalandJavaslang @koenighotze
option all the Things
User user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
59. #JavalandJavaslang @koenighotze
option all the Things
Option<User> user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
60. #JavalandJavaslang @koenighotze
option all the Things
Option<User> user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
61. #JavalandJavaslang @koenighotze
option all the Things
Option<User> user = repo.findOne("id");
user.flatMap(User::getAddress)
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
Option<User> user = repo.findOne("id");
user.flatMap(User::getAddress)
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
} Option<Address> getAddress()
62. #JavalandJavaslang @koenighotze
option all the Things
Option<User> user = repo.findOne("id");
user.flatMap(User::getAddress)
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
63. #JavalandJavaslang @koenighotze
option all the Things
Option<User> user = repo.findOne("id");
user.flatMap(User::getAddress)
Address address = user.getAddress();
.map(Address::getStreet)
return address.getStreet();
}
}
97. #JavalandJavaslang @koenighotze
Running tests
2017-03-21 10:45:59.913 INFO 45701 --- FrameworkServlet '': initialization started
2017-03-21 10:45:59.925 INFO 45701 --- FrameworkServlet '': initialization completed in 12 ms
Storing User@217b0952[username=rwxbeoigyesbeqqz,email=W`a@0c..-.--db-.T5-.2-g,
Storing User@4e6280de[username=vptafghfwuwwrwall,email=sByP@6jLA4.J.1c..5h269O3-1M6-c6...-.-,,,
Storing User@2fca282c[username=qmhkjdtvbtjzfciwcceqgzfznzkhhcokiyoipdefbr,email=Q96!@6.n8.
Storing User@64d53f0d[publicId=e9d7a121-9f23-483a-828a-f9e3045fc297,username=unflrpvztxtmi...
...
Storing User@1b10f60e[publicId=6f084c18-415c-42c4-b1a8-00c5c1fc9e67,username=xwhpdpjowirsmjym...
Storing User@4b916cc2[publicId=a2b9db2c-0189-4fe8-843d-e709ef3886fa,username=yxdidpexnayyjpzo...
Should not go boom: OK, passed 1000 tests in 3719 ms.
98. #JavalandJavaslang @koenighotze
Failures
Should not go boom: Falsified after 23 passed tests in 3005 ms.
java.lang.AssertionError: Expected satisfied check result but was Falsified(…,
sample = ( 풧 ꜏, 燤䠽뾌密ᵓ뫶খᄀ ꌎ ⬆鹮 라鄽뾮魨 붐맧놌 엍첮
䏨➰ìឧ寅罟 溌椡ﲡ셋欙밶ῴﯯ缲ꢶꇞ⌽ꪂ惗 쎂蘄펮뎷粻뵞?푠쏽쥎,
fzqlbkljxhfrghllzcthvgqiglaabihkzgsqwgfcichamyonmayiewwsfwmw
ntzvozqqydkqillhpyi, +g4@F.8yOkj.-....C6GUP..3.4.-..h-
V74.E.-----2T.z97..3f1ZM6))
99. #JavalandJavaslang @koenighotze
Why property Based tests?
Declarative, infinit test cases
Have you tested for all characters…
…even for 💩?
Have you tested usernames like…
౧ప唆⏑쀋䯰㨼ᮁ娤즶?搃蘸阁뺬ᡧ㫈葷㖒ܪ匘ᤫ䳴㻅
댇껓痯믶㙃銐璚풔랾ᄰ 䩰삀싲闆䩟嗀嗀侀