Introduction to Unit Testing (Part 2 of 2)
-
Upload
dennis-byrne -
Category
Software
-
view
90 -
download
3
description
Transcript of Introduction to Unit Testing (Part 2 of 2)
![Page 1: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/1.jpg)
Dennis Byrne
Introduction to Unit Test gPart 2 of 2
![Page 2: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/2.jpg)
Agenda …
● mock()
● when()
● verify()
● ArgumentCaptor
● reset()
![Page 3: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/3.jpg)
Encapsulation, Encapsulation, Encapsulation
![Page 4: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/4.jpg)
Law of Demeter
● Each unit should have only limited knowledge about other units:
only units "closely" related to the current unit.
● Each unit should only talk to its friends; don't talk to strangers.
● Only talk to your immediate friends.
![Page 5: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/5.jpg)
Mockito.mock()
@Test
public void lawOfDemeterBroken(){
Person gnan = mock(Person.class);
Pants pants = mock(Pants.class);
Wallet wallet = mock(Wallet.class);
Collection<Bill> bills = mock(Collection.class);
Bill bill = mock(Bill.class);
Iterator<Bill> iterator = mock(Iterator.class);
// …
![Page 6: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/6.jpg)
Mockito.when()
// …
when(gnan.getPants()).thenReturn(pants);
when(pants.getWallet()).thenReturn(wallet);
when(wallet.getBills()).thenReturn(bills);
when(bills.iterator()).thenReturn(iterator);
when(iterator.hasNext()).thenReturn(true);
when(iterator.next()).thenReturn(bill);
when(bill.getValue()).thenReturn(5);
![Page 7: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/7.jpg)
Law of Demeter: broken
// ...
Person dennis = new Person();
borrow(gnan, dennis, 5);
assertTrue(dennis.getPants().getWallet().getBills().contains(bill));
}
![Page 8: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/8.jpg)
Law of Demeter: broken public static void borrow(Person from, Person to, int amount){
Iterator<Bill> iterator =
from.getPants().getWallet().getBills().iterator();
while (iterator.hasNext()) {
Bill bill = iterator.next();
if(bill.getValue() == amount){
iterator.remove();
to.getPants().getWallet().getBills().add(bill);
break;
}
}
}
![Page 9: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/9.jpg)
Law of Demeter: fixed
@Test
public void lawOfDemeter(){
Person gnan = mock(Person.class);
when(gnan.removeMoneyAmount(anyInt())).thenReturn(new Bill(5));
Person dennis = new Person();
dennis.borrow(5, gnan);
assertEquals(5, dennis.getMoneyTotal());
}
![Page 10: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/10.jpg)
“Test First” Running Total
1
![Page 11: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/11.jpg)
Law of Demeter
public String methodChain(){
StringBuilder builder = new StringBuilder();
builder.append("this")
.append("doesn't")
.append("break")
.append("encapsulation");
return builder.toString();
}
![Page 12: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/12.jpg)
Agenda …
● mock()
● when()
● verify()
● ArgumentCaptor
● reset()
![Page 13: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/13.jpg)
Testing behavior/interactions @Test public void behaviorBad() {
FederatedSearchServer searchServer = new FederatedSearchServer(){
private int callCount = 0;
@Override public List<JSONObject> doPeopleNameSearch(String name) {
if(callCount++ > 0)
Assert.fail();
return super.doPeopleNameSearch(name);
}
};
VoltronServer voltron = new VoltronServer(searchServer);
voltron.doPeopleNameSearch("conan");
voltron.doPeopleNameSearch("conan");
}
![Page 14: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/14.jpg)
“Test First” Running Total
2
![Page 15: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/15.jpg)
“Test First” Running Total
3
![Page 16: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/16.jpg)
Mockito.verify @Test
public void behavior(){
FederatedSearchServer searchServer = mock(FederatedSearchServer.class);
when(searchServer.doPeopleNameSearch("conan")).thenReturn(new
LinkedList<JSONObject>());
VoltronServer voltron = new VoltronServer(searchServer);
voltron.doPeopleNameSearch("conan");
voltron.doPeopleNameSearch("conan");
verify(searchServer, times(1)).doPeopleNameSearch("conan");
// atLeast(n) anyString()
// atMost(n)
// never()
}
![Page 17: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/17.jpg)
“Test First” Running Total
4
![Page 18: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/18.jpg)
Agenda … Mockito
● mock()
● when()
● verify()
● ArgumentCaptor
● reset()
![Page 19: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/19.jpg)
Mockito - ArgumentCaptor
@Test
public void argumentCaptor() {
FederatedSearchServer searchServer = mock(FederatedSearchServer.class);
VoltronServer voltronServer = new VoltronServer(searchServer);
voltronServer.doPeopleNameSearch("conan");
ArgumentCaptor<PeopleSearchRequest> captor = forClass(PeopleSearchRequest.class);
verify(searchServer).doPeopleNameSearch(captor.capture());
PeopleSearchRequest passedToSearchServer = captor.getValue();
assertEquals("conan", passedToSearchServer.getSearchTerm());
}
![Page 20: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/20.jpg)
Agenda … Mockito
● mock()
● when()
● verify()
● ArgumentCaptor
● reset()
![Page 21: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/21.jpg)
TestNG vs. JUnit
private FederatedSearchServer searchServer =
mock(FederatedSearchServer.class);
@Test
public void searchWithStemming(){
VoltronServer voltronServer = new VoltronServer(searchServer);
List<JSONObject> results = voltronServer.doPeopleNameSearch("con");
assertEquals(results.get(0).get("name"), "Conan O'Brian");
}
![Page 22: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/22.jpg)
TestNG vs. JUnit
@Test
public void searchWithFullName(){
List<JSONObject> hits = new LinkedList<JSONObject>();
hits.add(new JSONObject("Conan O'Brian"));
when(searchServer.doPeopleNameSearch(anyString())).thenReturn(hits);
VoltronServer voltronServer = new VoltronServer(searchServer);
List<JSONObject> results =
voltronServer.doPeopleNameSearch("conan");
assertEquals(results.get(0).get("name"), "Conan O'Brian");
}
![Page 23: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/23.jpg)
TestNG vs. JUnit
@AfterMethod
public void afterMethod(){
reset(this.searchServer);
}
![Page 24: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/24.jpg)
“Test First” Running Total
5
![Page 25: Introduction to Unit Testing (Part 2 of 2)](https://reader036.fdocuments.us/reader036/viewer/2022081414/54b7026f4a7959aa2a8b4730/html5/thumbnails/25.jpg)
Agenda … Mockito
● mock()
● when()
● verify()
● ArgumentCaptor
● reset()