• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Unit testing with Easymock
 

Unit testing with Easymock

on

  • 4,929 views

 

Statistics

Views

Total Views
4,929
Views on SlideShare
4,918
Embed Views
11

Actions

Likes
1
Downloads
124
Comments
0

1 Embed 11

http://www.slideshare.net 11

Accessibility

Categories

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • Good practice is to assign mock object to field and create it inside setup method. Where to put verify?
  • Usually not very useful since we don't care about the order. Even if order is important test mostly fails anyway if wrong order of calls.
  • Does not care about input arguments. Returns default values. Works if you have no expects.
  • One cotcha – if using arg matcher for one argument must also use for others

Unit testing with Easymock Unit testing with Easymock Presentation Transcript

  • Easy testing with EasyMock (Java 5) Ürgo Ringo Aqris Software
  • Developer tests - big theory
    • Why/when
      • short feedback loop
    • Classic vs mock testing
      • http://martinfowler.com/articles/mocksArentStubs.html
    • Failing legacy tests
      • check if can be fixed; if not separate from working ones
  • EasyMock mock types (1)
    • normal mocks
      • expect – replay – verify
    @ Before public void setUp() { userDao = EasyMock. createMock (UserDao. class ); validator = new UserValidator( userDao ); } @ Test public void duplicateLoginNameIsInvalid() throws Exception { User user = ... errors = new BindException(user, "User" ); EasyMock.expect( userDao .isValidLoginName(user)).andReturn( false ); EasyMock.replay( userDao ); validator .validate(user, errors); assertTrue(errors.toString(), errors.hasErrors()); EasyMock.verify( userDao ); }
  • EasyMock mock types (2)
    • strict mocks
      • checks order of calls
      • useful if test contains many different or complex scenarios (bad style?)
    userDao = EasyMock. createStrictMock (UserDao. class );
  • EasyMock mock types (3)
    • nice mocks
      • useful if default return value is OK
      • Warning: are you in “getting it pass” mode?
      • if cannot implement nice equals for some argument (but there is better alternative!)
    filterDao = createNiceMock(FilterDao. class ); //expect(filterDao.getFilterId("unique-filter-name", USER_ID)).andReturn(null); replay( filterDao ); validator.validate(filter, errors); assertFalse(errors.hasErrors()); verify( filterDao );
  • Argument matchers
    • when to use
      • if default equals based check doesn't work
    • predefined matchers
      • eq(X value)
      • aryEq(X value)
      • isNull(), notNull()
      • ...
  • Custom argument matchers
    • useful if object equals doesn't work
    mockSender .send(eqMessageText( simpleMessage )); replay ( mockSender ); sender .sendAccountApprovedNotification( user , password); verify ( mockSender ); private SimpleMailMessage eqMessageText( final SimpleMailMessage expected) { EasyMock. reportMatcher ( new IArgumentMatcher() { public void appendTo(StringBuffer buffer) { } public boolean matches(Object argument) { SimpleMailMessage actual = (SimpleMailMessage) argument; assertEquals (expected.getText(), actual.getText()); assertEquals (expected.getSubject(), actual.getSubject()); assertEquals (expected.getFrom(), actual.getFrom()); assertEquals (expected.getTo()[0], actual.getTo()[0]); return true ; } }); return expected; }
  • D efine answer at runtime
    • IAnwer interface
    @Test public void showErrorsOnPage1() throws Exception { StepHandler stepHandler = createMock(StepHandler.class); ... stepHandler.validate( eq ( step0 .getModel()), (Errors) notNull ()); expectLastCall ().andAnswer( new IAnswer<Object>() { public Object answer() { Errors errors = ((Errors) getCurrentArguments ()[1]); errors.reject( &quot;Error occurred in one step&quot; ); return null ; } }); replay (stepHandler); ... verify (stepHandler); }
  • EasyMock more exotic stuff
    • for implementing stubs
      • asStub() / asStubReturn()
      • asStubAnswer
    • mock only some methods
      • createMock(Class<T>, Method[])
  • EasyMock meets Unitils import static org.unitils.easymock.EasyMockUnitils.*; public class MockingTest extends UnitilsJUnit4 { @Mock private UserDao userDao ; @ Before public void setUp() { //userDao = createMock (UserDao. class ); validator = new UserValidator( userDao ); } @ Test public void duplicateLoginNameIsInvalid() throws Exception { User user = ... errors = new BindException(user, &quot;User&quot; ); expect( userDao .isValidLoginName(user)).andReturn( false ); //replay(userDao); replay (); validator .validate(user, errors); assertTrue(errors.toString(), errors.hasErrors()); //verify(userDao); verify (); } }
    • http://www.unitils.org/