25
Dennis Byrne Introduction to Unit Test g Part 2 of 2

Introduction to Unit Testing (Part 2 of 2)

Embed Size (px)

DESCRIPTION

A presentation on introductory unit testing.

Citation preview

Page 1: Introduction to Unit Testing (Part 2 of 2)

Dennis Byrne

Introduction to Unit Test gPart 2 of 2

Page 2: Introduction to Unit Testing (Part 2 of 2)

Agenda …

● mock()

● when()

● verify()

● ArgumentCaptor

● reset()

Page 3: Introduction to Unit Testing (Part 2 of 2)

Encapsulation, Encapsulation, Encapsulation

Page 4: Introduction to Unit Testing (Part 2 of 2)

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)

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)

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)

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)

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)

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)

“Test First” Running Total

1

Page 11: Introduction to Unit Testing (Part 2 of 2)

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)

Agenda …

● mock()

● when()

● verify()

● ArgumentCaptor

● reset()

Page 13: Introduction to Unit Testing (Part 2 of 2)

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)

“Test First” Running Total

2

Page 15: Introduction to Unit Testing (Part 2 of 2)

“Test First” Running Total

3

Page 16: Introduction to Unit Testing (Part 2 of 2)

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)

“Test First” Running Total

4

Page 18: Introduction to Unit Testing (Part 2 of 2)

Agenda … Mockito

● mock()

● when()

● verify()

● ArgumentCaptor

● reset()

Page 19: Introduction to Unit Testing (Part 2 of 2)

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)

Agenda … Mockito

● mock()

● when()

● verify()

● ArgumentCaptor

● reset()

Page 21: Introduction to Unit Testing (Part 2 of 2)

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)

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)

TestNG vs. JUnit

@AfterMethod

public void afterMethod(){

reset(this.searchServer);

}

Page 24: Introduction to Unit Testing (Part 2 of 2)

“Test First” Running Total

5

Page 25: Introduction to Unit Testing (Part 2 of 2)

Agenda … Mockito

● mock()

● when()

● verify()

● ArgumentCaptor

● reset()