/* Created on 19.07.2004 */ package test.jmock.extension; import org.jmock.Mock; import org.jmock.core.DynamicMockError; import org.jmock.core.constraint.IsEqual; import org.jmock.core.matcher.InvokeOnceMatcher; import org.jmock.extension.CGLibCoreMock; import junit.framework.TestCase; /** * @author Martin Kersten */ public class CGLibCoreMockTest extends TestCase { private CGLibCoreMock simpleCoreMock; private CGLibCoreMock complexCoreMock; protected void setUp() throws Exception { super.setUp(); simpleCoreMock=new CGLibCoreMock(SimpleClass.class,"simpleClassMock"); complexCoreMock=new CGLibCoreMock(ComplexClass.class,"complexClassMock"); } public void testDefaultConstructor() { SimpleClass proxy=(SimpleClass)simpleCoreMock.createProxy(); assertEquals(0,proxy.integer); assertEquals("",proxy.string); assertMockBehaviour(proxy); } public void testDefaultConstructorUsedIfNoProxyExists() { SimpleClass proxy=(SimpleClass)simpleCoreMock.proxy(); assertEquals(0,proxy.integer); assertEquals("",proxy.string); assertMockBehaviour(proxy); } public void testRecreationOfTheProxyIsUnsupported() { SimpleClass proxy=(SimpleClass)simpleCoreMock.createProxy(); try { simpleCoreMock.createProxy(); fail("a proxy should only be created once"); } catch(UnsupportedOperationException e) {} } public void testNonDefaultConstructorSingleParameter() { SimpleClass proxy=(SimpleClass)simpleCoreMock.createProxy( new Class[] {String.class}, new String [] {"aString"}); assertEquals(-1,proxy.integer); assertEquals("aString",proxy.string); assertMockBehaviour(proxy); } public void testNonDefaultConstructorTwoParameters() { SimpleClass proxy=(SimpleClass)simpleCoreMock.createProxy( new Class[] {int.class, String.class},new Object [] {new Integer(10), "aString"}); assertEquals(10,proxy.integer); assertEquals("aString",proxy.string); assertMockBehaviour(proxy); } public void testNonDefaultComplexConstructor() { ComplexClass proxy=(ComplexClass)complexCoreMock.createProxy( new Class[] {String.class}, new String [] {"aString"}); assertEquals("aString",proxy.string); assertMockBehaviour(proxy); } public void testComplexConstructorWithExpectations() { Mock mock=new Mock(complexCoreMock); mock.expects(new InvokeOnceMatcher()). method("setString").with(new IsEqual("aString")); ComplexClass proxy=(ComplexClass)complexCoreMock.createProxy( new Class[] {String.class}, new String [] {"aString"}); assertNull("aString",proxy.string); assertMockBehaviour(proxy); mock.verify(); } private void assertMockBehaviour(BaseClass proxy) { try { proxy.publicMethod(); fail(); } catch(DynamicMockError e) { } } public static class BaseClass{ public void publicMethod() { } } public static class SimpleClass extends BaseClass { public final int integer; public final String string; public SimpleClass() { this.string=""; this.integer=0; } public SimpleClass(String string) { this(-1,string); } public SimpleClass(int integer,String string) { this.integer=integer; this.string=string; } } public static class ComplexClass extends BaseClass{ public String string=null; public ComplexClass(String string) { setString(string); } protected void setString(String string) { this.string=string; } } }