package org.hamcrest.examples.junit3; import static org.hamcrest.JMock1Matchers.equalTo; import org.jmock.Mock; import org.jmock.MockObjectTestCase; /** * Demonstrates how HamCrest matchers can be used from jMock with JUnit 3.8.x. * * @author Joe Walnes */ public class ExampleWithJMock1 extends MockObjectTestCase { /* jMock specific notes: * * Important terminology: * What jMock calls 'Constraints', Hamcrest calls 'Matchers'. * * Note: This is only valid for jMock1. jMock2 supports Hamcrest out * of the box. * * The class extends org.jmock.MockObjectTestCase as usual. * This provides: * - The mock() methods and syntactic sugar for setting up mocks. * - Auto verification of mocks. * - jMock's implementation of assertThat(). * - jMock's standard Constraints. * * The additional Hamcrest Matchers can be used by using a static import: * import static org.hamcrest.JMockMatchers.*; * * This provides the Hamcrest library of Matchers through an interface * that will provide an adapter to JMock Constraints. */ /** * A sample interface to be mocked. */ public static interface AnInterface { void doStuff(String string); } private Mock mock = mock(AnInterface.class); private AnInterface anInterface = (AnInterface) mock.proxy(); /** * This examples shows using a mock with a standard jMock constraint. * Hamcrest is not used here. */ public void testUsingAJMockConstraint() { mock.expects(atLeastOnce()).method("doStuff") .with(stringContains("cheese")); anInterface.doStuff("i like cheese and stuff"); } /** * This examples shows using a mock with a Hamcrest matcher, adapted * to jMock. */ public void testUsingAHamcrestMatcher() { mock.expects(atLeastOnce()).method("doStuff") .with(equalTo("xx")); anInterface.doStuff("xx"); } /** * This examples shows using the standard jMock assertThat() method * with both jMock Constraints and Hamcrest Matchers. */ public void testUsingAssertThat() { assertThat("i like cheese", stringContains("cheese")); // jMock Constraint. assertThat("xx", equalTo("xx")); // Hamcrest Matcher. assertThat("yy", not(equalTo("xx"))); // Mixture of both. } }