power mock at ore dev

Upload: rainer

Post on 05-Apr-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/31/2019 Power Mock at Ore Dev

    1/24

    Certified Java Professionals

    Johan Haleby and Jan Kronquist

    www.powermock.org

    Test the untestable

    1

    http://www.powermock.org/http://www.powermock.org/
  • 7/31/2019 Power Mock at Ore Dev

    2/24

    Certified Java Professionals

    Audience survey

    Writing unit tests?Using mock framework?

    Using EasyMock?

    Frustrated with current limitations?

    2

  • 7/31/2019 Power Mock at Ore Dev

    3/24

    Certified Java Professionals

    Automated + isolated testing

    TestCase

    CodeUnderTest

    A

    B

    Mock A

    Mock B

    3

  • 7/31/2019 Power Mock at Ore Dev

    4/24

    Certified Java Professionals

    Mock objects and stubs

    Simulated objects that mimic behavior of real objects

    Stubs provide canned replies

    Mocks verify expectations

    4

  • 7/31/2019 Power Mock at Ore Dev

    5/24

    Certified Java Professionals

    EasyMock

    // Create a mock

    SomeInterface mock = createMock(SomeInterface.class);

    // Record behavior

    expect(mock.doStuff("argument")).andReturn("returnValue");

    // Replay behavior

    replay(mock);

    // Executing the code we want to test

    assertEquals("returnValue", test.perform());

    // Verify behavior

    verify(mock);

    5

  • 7/31/2019 Power Mock at Ore Dev

    6/24

    Certified Java Professionals

    Traditional assumptions

    Testable = good design

    Testable = easy to understand

    Testable = limitations

    6

  • 7/31/2019 Power Mock at Ore Dev

    7/24

    Certified Java Professionals

    Problem - Static methods

    Not possible to mock

    Still 3rd party libraries that use them

    Eclipse, Java ME

    7

  • 7/31/2019 Power Mock at Ore Dev

    8/24

    Certified Java Professionals

    Problem - Static initializers

    You cannot unit test a class with evil static initializerpublic class EvilStaticInitializer {

    static {

    System.loadLibrary(evil.dll);

    }

    }

    8

  • 7/31/2019 Power Mock at Ore Dev

    9/24

    Certified Java Professionals

    Problem - Final class / method

    Final methods cannot be mocked

    Why use final?

    Ensure that your classes are not misused

    Correct object construction

    Examples: Wicket, Apache Mina

    9

  • 7/31/2019 Power Mock at Ore Dev

    10/24

    Certified Java Professionals

    Problem - Private methods/state

    Invocation is hardMocking not possible

    State access not possible

    Private is used to enforce encapsulation

    10

  • 7/31/2019 Power Mock at Ore Dev

    11/24

    Certified Java Professionals

    Problem - Using new

    Code not designed for testingNot everything needs to be injected

    File file = new File(fileName);

    if (file.exists()) {

    doStuff();

    }

    11

  • 7/31/2019 Power Mock at Ore Dev

    12/24

    Certified Java Professionals

    Traditional solutions

    Better design and IoC

    Wrap static methods

    Factory methods

    Package private instead of privateAvoid final and static initializers

    12

  • 7/31/2019 Power Mock at Ore Dev

    13/24

    Certified Java Professionals

    Static method - example

    publicclass MessageDao {

    publicvoid addMessage(Message message) throws RecordStoreException { RecordStore recordStore = null; try { recordStore = RecordStore.openRecordStore(name, true); ...

    } finally { if (recordStore != null) { recordStore.closeRecordStore(); } } }}

    13

  • 7/31/2019 Power Mock at Ore Dev

    14/24

    Certified Java Professionals

    Solution 1 - Partial mock

    publicclass MessageDao {

    publicvoid addMessage(Message message) throws RecordStoreException { RecordStore recordStore = null; try { recordStore = openOrCreateRecordStore(name); ...

    } finally { if (recordStore != null) { recordStore.closeRecordStore(); } } } protected RecordStore openOrCreateRecordStore(String name) { return RecordStore.openRecordStore(name, true); }}

    14

  • 7/31/2019 Power Mock at Ore Dev

    15/24

    Certified Java Professionals

    Solution 2 - DI

    publicclass MessageDao {

    private RecordStoreFactory recordStoreFactory; public MessageDao(RecordStoreFactory recordStoreFactory) { this.recordStoreFactory = recordStoreFactory; } publicvoid addMessage(Message message) throws RecordStoreException {

    RecordStore recordStore = null; try { recordStore = recordStoreFactory.openOrCreateRecordStore(name); ... } finally { if (recordStore != null) { recordStore.closeRecordStore(); } } }}

    15

  • 7/31/2019 Power Mock at Ore Dev

    16/24

    Certified Java Professionals

    Static method - example

    publicclass MessageDao {

    publicvoid addMessage(Message message) throws RecordStoreException { RecordStore recordStore = null; try { recordStore = RecordStore.openRecordStore(name, true); ...

    } finally { if (recordStore != null) { recordStore.closeRecordStore(); } } }}

    16

  • 7/31/2019 Power Mock at Ore Dev

    17/24

    Certified Java Professionals

    Using PowerMock

    publicclass MessageDao {

    publicvoid addMessage(Message message) throws RecordStoreException { RecordStore recordStore = null; try { recordStore = RecordStore.openRecordStore(name, true); ...

    } finally { if (recordStore != null) { recordStore.closeRecordStore(); } } }}

    17

  • 7/31/2019 Power Mock at Ore Dev

    18/24

    Certified Java Professionals

    PowerMock test case

    publicclass MessageDaoTest {

    publicvoid testAddMessage() throws Exception { mockStatic(RecordStore.class); // Record behavior expect(RecordStore.openRecordStore("name", true))

    .andReturn(recordStoreMock);

    // Replay behavior replay(RecordStore.class); // Executing the code we want to test Message message = new Message(); messageDao.addMessage(message);

    ...

    // Verify behavior verify(RecordStore.class); }}

    @RunWith(PowerMockRunner.class)

    @PrepareForTest(RecordStore.class)

    18

  • 7/31/2019 Power Mock at Ore Dev

    19/24

    Certified Java Professionals

    PowerMock

    Drop in jar file

    Allow full semantics of the language

    Clean separation of test and production code

    Extends EasyMockOpen source (Apache License 2.0)

    19

  • 7/31/2019 Power Mock at Ore Dev

    20/24

    Certified Java Professionals

    DEMO

    Mock static method

    Mock construction

    Suppress static initializers

    20

  • 7/31/2019 Power Mock at Ore Dev

    21/24

    Certified Java Professionals

    Traditional assumptions

    Testable = good design

    Testable = easy to understand

    Testable = limitations

    arewrong

    21

  • 7/31/2019 Power Mock at Ore Dev

    22/24

    Certified Java Professionals

    Future

    Anonymous inner classes

    Improved mock creation

    Improved type safety

    Other test frameworksOther mock frameworks

    22

  • 7/31/2019 Power Mock at Ore Dev

    23/24

    Certified Java Professionals

    Benefits

    Testable legacy code

    Third party code

    More design options

    23

  • 7/31/2019 Power Mock at Ore Dev

    24/24

    Certified Java Professionals

    www.powermock.org

    http://www.powermock.org/http://www.powermock.org/