designing better software

46
Designing Better Software with Mock Objects using Dependency Injection

Upload: gordy

Post on 02-Feb-2016

45 views

Category:

Documents


0 download

DESCRIPTION

Designing Better Software. with Mock Objects using Dependency Injection. Who is this guy?. [email protected]. Jenga Driven Development (JDD). Jenga Driven Development (JDD). Who are you?. What is meant by better software?. Easier To Test. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Designing Better Software

Designing Better Software

with Mock Objectsusing Dependency Injection

Page 2: Designing Better Software

Who is this guy?

[email protected]

Page 3: Designing Better Software

Jenga Driven Development (JDD)

Page 4: Designing Better Software

Jenga Driven Development (JDD)

Page 5: Designing Better Software

Who are you?

Page 6: Designing Better Software

What is meant by better software?

Page 7: Designing Better Software

Easier To Test

Page 8: Designing Better Software

100% Coverage (Or at least as close as possible)

Page 9: Designing Better Software

Looser Coupling

Page 10: Designing Better Software

Notations 

Page 11: Designing Better Software

Notation  IClassName is Interface

public interface  ICustomerRepository {...}

Page 12: Designing Better Software

Notation  ClassName is Implementation

public class CustomerRepository {...}

Page 13: Designing Better Software

Notation

Class X (Client)

object.doSomething()

Class Ypublic void

doSomething(){

Client – Refers to a Class that invokes behaviour in another Class

Page 14: Designing Better Software

Testing

Page 15: Designing Better Software

Tenents of Unit Testing

Page 16: Designing Better Software

Tenents of Unit Testing

Page 17: Designing Better Software

Tenents of Unit Testing

Page 18: Designing Better Software

Dependency Injection

Page 19: Designing Better Software

What Problem are we solving?

Page 20: Designing Better Software

Remove Dependency from X to Abc, Def 

Page 21: Designing Better Software

Dependency Injection

Page 22: Designing Better Software

Dependency Injection

Page 23: Designing Better Software

Remove Clutter Other Patterns Introduce

public class X {    private IAbc abc;    public void doSomething() {        int x = abc.getValue();  //No error checking/lookup etc.        return x + 42;    }...}

AbcLocator locator = ServiceLocator.locator(); IAbc abc = locator.abc();         or AbcFactory.getAbc();

Page 24: Designing Better Software

Question?

What do we replace these implementations with?

Page 25: Designing Better Software

Mock Objects

Page 26: Designing Better Software

EasyMock - Overview

Page 27: Designing Better Software

EasyMock - Creating Mock Objects

Example (Snippet)    ...    IRepository mock = createMock(IRepository.class);

Page 28: Designing Better Software

EasyMock - Defining Expectations

Example (Snippet)    ...    IRepository mock = createMock(IRepository.class);     expect(mock.getValue()).andReturn(42);

Page 29: Designing Better Software

EasyMock - Change Mode

Example (Snippet)    ...    IRepository mock = createMock(IRepository.class);     expect(mock.getValue()).andReturn(42);    replay(mock);

Page 30: Designing Better Software

EasyMock - Manually Inject Mock

Example (Snippet)    ...    IRepository mock = createMock(IRepository.class);     expect(mock.getValue()).andReturn(42);    replay(mock);    service.setRepository(mock);    

Page 31: Designing Better Software

EasyMock - Invoke Real Method

Example (Snippet)    ...    IRepository mock = createMock(IRepository.class);     expect(mock.getValue()).andReturn(42);    replay(mock);    service.setRepository(mock);    x = service.doSomething();    

Page 32: Designing Better Software

EasyMock - Assert (verify) 

Example (Snippet)    ...    IRepository mock = createMock(IRepository.class);     expect(mock.getValue()).andReturn(42);    replay(mock);    service.setRepository(mock);    x = service.doSomething();    veryify(mock);    

Page 33: Designing Better Software

Question? 

How do we know if we have tested everything?

Page 34: Designing Better Software

Emma - Code Coverage Overview 

Page 35: Designing Better Software

Emma - Instrumenting Classloader 

Page 36: Designing Better Software

Emma - Code Coverage Overview 

    

Page 37: Designing Better Software

Break

Page 38: Designing Better Software

Example

Page 39: Designing Better Software

Example - Terminology

CustomerDTO - Data Transfer ObjectCustomerService - WebServiceCustomerRepository (Repository Pattern)Customer - Entity (JPA) 

Page 40: Designing Better Software

Demo

Page 41: Designing Better Software

Pitfalls?

• Each client must provide implementation of Abc to X?• Doesn't this break the concept of encapsulation?

Page 42: Designing Better Software

Spring IoC Container a formalized means of composing disparate components into a fully working application ready for use

Page 43: Designing Better Software

Questions?

Page 44: Designing Better Software

Thanks

Please feel free to contact me at:

[email protected]

Page 45: Designing Better Software

Two Types of Mock ObjectsImplement your ownpublic class XTest extends TestCase {    public void testDoSomething() {       IAbc mock = new MyMock();       X x = new X();       x.setAbc(mock);

       x.doSomething();       assertTrue(x.hasFinished());    }}

Page 46: Designing Better Software

Two Types of Mock ObjectsImplement your ownpublic class XTest extends TestCase {    public void testDoSomething() {       IAbc mock = new MyMock();       X x = new X();       x.setAbc(mock);

       x.doSomething();       assertTrue(x.hasFinished());    }} public class MyMock implements IAbc {

    public int getValue() {       return 42; //Answer to life, the universe ...    }

    public boolean isValidObject() {        return false;    }}