1Copyright 2005 ThoughtWorks, Inc. All rights reserved. Do not copy or distribute without permission.
JMock Crash-Course
By Paul Hammant ofThoughtWorks, Inc
2Copyright 2005 ThoughtWorks, Inc. All rights reserved. Do not copy or distribute without permission.
• Too hard to test things that involve externalcomponents?
• Too slow, even if you could?• Unit Tests as much fun as smacking yourself
in the head with a baseball bat?
• You can ‘mock’ out SpellChecker while unit-testing WordProcessor, etc
• Anything ‘external’ or ‘heavy’ to the thing youreally want to test.
Why?Why?
3Copyright 2005 ThoughtWorks, Inc. All rights reserved. Do not copy or distribute without permission.
public class FooTest extends MockObjectTestCase { Mock mockMap = mock(Map.class); public void testJMockItself() {
mockMap.expects(once()).method(“get”) .with(eq(“jmock-rocks”)) .will(returnValue(“Yup”));
Map map = (Map) mockMap.proxy(); assertEquals(“Yup”, map.get(“jmock-rocks”)); }}
If anything other than that happens, exceptions will be thrown by JMock
“mockMapexpects ‘get’to be invokedonce with asingleparameter of‘jmock-rocks’and will returna value of‘Yup’.” *
Simple ExampleSimple Example
4Copyright 2005 ThoughtWorks, Inc. All rights reserved. Do not copy or distribute without permission.
How many times the method is called:
• expects(once())• expects(atLeastOnce())• expects(exactly( n ))• expects(never())
ConstraintsConstraints
5Copyright 2005 ThoughtWorks, Inc. All rights reserved. Do not copy or distribute without permission.
• with( .. )Syntax:• with(eq( parm1 ), eq( parm2 )) // etcAlternatives:• withNoArguments()• withAnyArguments()Some Boolean Flexibility:• same( .. ) & isA ( ..) & not ( .. ) & or ( .. )
& and ( .. ) // complex huh?
ParametersParameters
6Copyright 2005 ThoughtWorks, Inc. All rights reserved. Do not copy or distribute without permission.
• will(returnValue ( .. ))
• will(throwException ( .. ))
ReturnsReturns
7Copyright 2005 ThoughtWorks, Inc. All rights reserved. Do not copy or distribute without permission.
• Use with Junit (not instead of)– MockObjectTestCase extends TestCase
• It is just a simple library– that uses lots of reflection
• Can do concrete classes too -– via another library - more difficult to get right
• its.builder().syntax().reads().well().right();• www.jmock.org - widely used and respected• Other tools by Joe Walnes: XStream, QDox,
Sitemesh, NMock
JMock JMock FactsFacts