From: Tim M. <ma...@us...> - 2003-04-07 14:27:31
|
Update of /cvsroot/mockobjects/mockobjects-java/src/core/com/mockobjects/dynamic In directory sc8-pr-cvs1:/tmp/cvs-serv10938/src/core/com/mockobjects/dynamic Modified Files: Tag: DynamicMockExperiment Mock.java CallMocker.java CallSet.java Added Files: Tag: DynamicMockExperiment ExpectedCall.java ReturnStub.java CallStub.java ThrowStub.java Removed Files: Tag: DynamicMockExperiment SingleCall.java Log Message: Refactored class hierarchy: - call actions can be stubbed - stubs can be decorated with expectations - calls can be grouped in a CallSet (set/bag) - a mock object inherits from CallSet --- NEW FILE: ExpectedCall.java --- /* * Created on 04-Apr-2003 * */ package com.mockobjects.dynamic; import junit.framework.*; import com.mockobjects.constraint.*; import com.mockobjects.util.*; public class ExpectedCall extends Assert implements CallMocker { private String methodName; private Constraint[] constraints; private boolean wasCalled = false; private CallMocker decorated; public ExpectedCall( String methodName, Constraint[] constraints, CallMocker decorated ) { this.methodName = methodName; this.constraints = (Constraint[])constraints.clone(); this.decorated = decorated; } public Object call( Mock mock, String methodName, Object[] args ) throws Throwable { assertEquals( methodName + " received the wrong number of arguments", constraints.length, args.length ); for( int i = 0; i < args.length; i++ ) { if( !constraints[i].eval(args[i]) ) { throw new AssertionFailedError( AssertMo.expectedErrorMessage( methodName + " received incorrect argument " + i, AssertMo.join(constraints), AssertMo.join(args) ) ); } } wasCalled = true; return decorated.call( mock, methodName, args ); } public void verify() { if( !wasCalled ) { throw new AssertionFailedError( methodName + " was not called" ); } } public boolean matches(String methodName, Object[] args) { if( !this.methodName.equals(methodName) ) return false; if( args.length != constraints.length ) return false; for (int i = 0; i < args.length; i++) { if( !constraints[i].eval(args[i]) ) return false; } return true; } public String getDescription() { return AssertMo.methodToString(methodName, constraints); } } --- NEW FILE: ReturnStub.java --- /* * Created on 07-Apr-2003 */ package com.mockobjects.dynamic; /** * @author dev */ public class ReturnStub extends CallStub { private Object result; public ReturnStub( Object result ) { this.result = result; } public Object call(Mock mock, String methodName, Object[] args) throws Throwable { return result; } public String getDescription() { return "returns <" + result + ">"; } } --- NEW FILE: CallStub.java --- /* * Created on 07-Apr-2003 */ package com.mockobjects.dynamic; /** * @author dev */ public abstract class CallStub implements CallMocker { public boolean matches(String methodName, Object[] args) { return true; } public void verify() { } } --- NEW FILE: ThrowStub.java --- /* * Created on 07-Apr-2003 */ package com.mockobjects.dynamic; /** * @author dev */ public class ThrowStub extends CallStub { private Throwable throwable; public ThrowStub( Throwable throwable ) { this.throwable = throwable; } public Object call(Mock mock, String methodName, Object[] args) throws Throwable { throw throwable; } public String getDescription() { return "throws <" + throwable + ">"; } } Index: Mock.java =================================================================== RCS file: /cvsroot/mockobjects/mockobjects-java/src/core/com/mockobjects/dynamic/Mock.java,v retrieving revision 1.16.2.1 retrieving revision 1.16.2.2 diff -u -r1.16.2.1 -r1.16.2.2 --- Mock.java 4 Apr 2003 16:47:34 -0000 1.16.2.1 +++ Mock.java 7 Apr 2003 14:26:52 -0000 1.16.2.2 @@ -8,15 +8,13 @@ import junit.framework.*; -import com.mockobjects.*; /** * @author dev */ -public class Mock implements Verifiable, InvocationHandler { +public class Mock extends CallSet implements InvocationHandler { private String name; private Object proxy; - private CallMocker call; public Mock( Class mockedClass, String name) { @@ -34,12 +32,16 @@ String name = c.getName(); int dotIndex = name.lastIndexOf('.'); if( dotIndex >= 0 ) { - return "mock-" + name.substring(dotIndex + 1 ); + return "mock" + name.substring(dotIndex + 1 ); } else { - return "mock-" + name; + return "mock" + name; } } - + + public String toString() { + return name; + } + public Object proxy() { return proxy; } @@ -48,25 +50,19 @@ throws Throwable { try { - return call.call( this, method.getName(), (args == null ? new Object[0] : args) ); + return call( this, method.getName(), (args == null ? new Object[0] : args) ); } catch( AssertionFailedError ex ) { throw new AssertionFailedError( name + ": " + ex.getMessage() ); } } - - public void expect(CallMocker mocker) { - call = mocker; - } public void verify() { - if( call != null ) { - try { - call.verify(); - } - catch( AssertionFailedError ex ) { - throw new AssertionFailedError( name + ": " + ex.getMessage() ); - } - } + try { + super.verify(); + } + catch( AssertionFailedError ex ) { + throw new AssertionFailedError( name + ": " + ex.getMessage() ); + } } } Index: CallMocker.java =================================================================== RCS file: /cvsroot/mockobjects/mockobjects-java/src/core/com/mockobjects/dynamic/Attic/CallMocker.java,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -r1.1.2.1 -r1.1.2.2 --- CallMocker.java 4 Apr 2003 16:47:37 -0000 1.1.2.1 +++ CallMocker.java 7 Apr 2003 14:26:53 -0000 1.1.2.2 @@ -7,6 +7,9 @@ public interface CallMocker extends Verifiable { + String getDescription(); + Object call( Mock mock, String methodName, Object[] args ) throws Throwable; + boolean matches(String methodName, Object[] args); } Index: CallSet.java =================================================================== RCS file: /cvsroot/mockobjects/mockobjects-java/src/core/com/mockobjects/dynamic/Attic/CallSet.java,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -r1.1.2.1 -r1.1.2.2 --- CallSet.java 4 Apr 2003 16:47:38 -0000 1.1.2.1 +++ CallSet.java 7 Apr 2003 14:26:53 -0000 1.1.2.2 @@ -5,6 +5,10 @@ import java.util.*; +import com.mockobjects.util.*; + +import junit.framework.*; + /** * @author dev */ @@ -14,8 +18,6 @@ public CallSet() { - super(); - // dodgy Auto-generated constructor stub } public Object call(Mock mock, String methodName, Object[] args) throws Throwable { @@ -25,9 +27,32 @@ return element.call(mock, methodName, args); } } - return null; + + StringBuffer buf = new StringBuffer(); + buf.append("Unexpected call to "); + buf.append( AssertMo.methodToString( methodName, args ) ); + buf.append( "\n" ); + buf.append( "Expected " ); + buf.append( getDescription() ); + throw new AssertionFailedError( buf.toString() ); } - + + public String getDescription() { + if( expectedCalls.isEmpty() ) { + return "no methods"; + } else { + StringBuffer buf = new StringBuffer(); + + buf.append( "one of:\n" ); + for( Iterator i = expectedCalls.iterator(); i.hasNext(); ) { + buf.append( ((CallMocker)i.next()).toString() ); + buf.append( "\n" ); + } + + return buf.toString(); + } + } + public void verify() { for (Iterator call = expectedCalls.iterator(); call.hasNext();) { CallMocker element = (CallMocker) call.next(); @@ -36,7 +61,7 @@ } - public void add(CallMocker call) { + public void expect(CallMocker call) { expectedCalls.add(call); } --- SingleCall.java DELETED --- |