Update of /cvsroot/mocklib/mocklib3/input/javasrc/biz/xsoftware/mock/impl
In directory sc8-pr-cvs7.sourceforge.net:/tmp/cvs-serv32615/input/javasrc/biz/xsoftware/mock/impl
Modified Files:
ThrowException.java MethodVerifier.java BehaviorInfo.java
MessageHelper.java MockSuperclass.java ReturnValue.java
Action.java
Added Files:
MockObjectFactoryImpl.java GenericAction.java
Log Message:
mocklib3 should be about complete. probably some tweaks it could use later.
Index: ReturnValue.java
===================================================================
RCS file: /cvsroot/mocklib/mocklib3/input/javasrc/biz/xsoftware/mock/impl/ReturnValue.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** ReturnValue.java 10 Sep 2006 20:45:05 -0000 1.1
--- ReturnValue.java 10 Sep 2006 22:35:21 -0000 1.2
***************
*** 1,5 ****
package biz.xsoftware.mock.impl;
! public class ReturnValue implements Action {
private Object retVal;
--- 1,5 ----
package biz.xsoftware.mock.impl;
! public class ReturnValue extends GenericAction implements Action {
private Object retVal;
***************
*** 9,13 ****
}
! public Object execute() {
return retVal;
}
--- 9,13 ----
}
! public Object execute(Object[] args) {
return retVal;
}
--- NEW FILE: GenericAction.java ---
package biz.xsoftware.mock.impl;
import java.lang.reflect.Method;
public class GenericAction {
private Method method;
public Method getMethod() {
return method;
}
public void setMethod(Method method) {
this.method = method;
}
}
Index: ThrowException.java
===================================================================
RCS file: /cvsroot/mocklib/mocklib3/input/javasrc/biz/xsoftware/mock/impl/ThrowException.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** ThrowException.java 10 Sep 2006 20:45:05 -0000 1.1
--- ThrowException.java 10 Sep 2006 22:35:21 -0000 1.2
***************
*** 1,5 ****
package biz.xsoftware.mock.impl;
! public class ThrowException implements Action {
private Throwable e;
--- 1,5 ----
package biz.xsoftware.mock.impl;
! public class ThrowException extends GenericAction implements Action {
private Throwable e;
***************
*** 9,13 ****
}
! public Object execute() throws Throwable {
e.fillInStackTrace();
throw e;
--- 9,13 ----
}
! public Object execute(Object[] args) throws Throwable {
e.fillInStackTrace();
throw e;
Index: BehaviorInfo.java
===================================================================
RCS file: /cvsroot/mocklib/mocklib3/input/javasrc/biz/xsoftware/mock/impl/BehaviorInfo.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** BehaviorInfo.java 10 Sep 2006 20:45:05 -0000 1.1
--- BehaviorInfo.java 10 Sep 2006 22:35:21 -0000 1.2
***************
*** 1,21 ****
package biz.xsoftware.mock.impl;
import biz.xsoftware.mock.Behavior;
! public class BehaviorInfo implements Action {
public BehaviorInfo(Behavior behavior) {
! // TODO Auto-generated constructor stub
}
! public Object execute() throws Throwable {
! // TODO Auto-generated method stub
! return null;
}
! public Object[] runClonerMethod() {
! // TODO Auto-generated method stub
! return null;
}
}
--- 1,32 ----
package biz.xsoftware.mock.impl;
+ import java.lang.reflect.Method;
+
import biz.xsoftware.mock.Behavior;
! public class BehaviorInfo extends GenericAction implements Action {
!
! private Behavior behavior;
! private Method behaviorMethod;
! private Method clonerMethod;
public BehaviorInfo(Behavior behavior) {
! this.behavior = behavior;
}
! public Object execute(Object[] args) throws Throwable {
! return behaviorMethod.invoke(behavior, args);
}
! public Object[] runClonerMethod(Object[] args) throws Throwable {
! return (Object[])clonerMethod.invoke(behavior, args);
! }
!
! public void setBehaviorMethod(Method behaviorMethod) {
! this.behaviorMethod = behaviorMethod;
}
+ public void setClonerMethod(Method clonerMethod) {
+ this.clonerMethod = clonerMethod;
+ }
}
--- NEW FILE: MockObjectFactoryImpl.java ---
package biz.xsoftware.mock.impl;
import java.lang.reflect.Proxy;
import biz.xsoftware.mock.MockObject;
import biz.xsoftware.mock.MockObjectFactory;
public class MockObjectFactoryImpl extends MockObjectFactory {
public MockObject createMockImpl(String id, Class[] interfaces) {
Class[] interfacesPlusMock = new Class[interfaces.length+1];
interfacesPlusMock[0] = MockObject.class;
for(int i = 1; i < interfacesPlusMock.length; i++) {
interfacesPlusMock[i] = interfaces[i-1];
}
ClassLoader cl = MockObjectFactory.class.getClassLoader();
MockObjectImpl impl = new MockObjectImpl(id, interfaces);
Object o = Proxy.newProxyInstance(cl, interfacesPlusMock, impl);
MockObject m = (MockObject)o;
return m;
}
}
Index: Action.java
===================================================================
RCS file: /cvsroot/mocklib/mocklib3/input/javasrc/biz/xsoftware/mock/impl/Action.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** Action.java 10 Sep 2006 20:45:05 -0000 1.1
--- Action.java 10 Sep 2006 22:35:21 -0000 1.2
***************
*** 1,6 ****
package biz.xsoftware.mock.impl;
public interface Action {
! public Object execute() throws Throwable;
}
--- 1,11 ----
package biz.xsoftware.mock.impl;
+ import java.lang.reflect.Method;
+
public interface Action {
! public Object execute(Object[] args) throws Throwable;
!
! public void setMethod(Method m);
! public Method getMethod();
}
Index: MockSuperclass.java
===================================================================
RCS file: /cvsroot/mocklib/mocklib3/input/javasrc/biz/xsoftware/mock/impl/MockSuperclass.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** MockSuperclass.java 10 Sep 2006 20:50:19 -0000 1.2
--- MockSuperclass.java 10 Sep 2006 22:35:21 -0000 1.3
***************
*** 1,4 ****
--- 1,5 ----
package biz.xsoftware.mock.impl;
+ import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
***************
*** 230,234 ****
if(action != null)
! return action.execute();
return null;
--- 231,235 ----
if(action != null)
! return action.execute(params);
return null;
***************
*** 513,518 ****
if(behavior == null)
throw new IllegalArgumentException("behavior parameter cannot be null");
! Action action = new BehaviorInfo(behavior);
addToActionList(action, method, argTypes);
}
--- 514,548 ----
if(behavior == null)
throw new IllegalArgumentException("behavior parameter cannot be null");
! BehaviorInfo action = new BehaviorInfo(behavior);
addToActionList(action, method, argTypes);
+
+ Method m = action.getMethod();
+ //verify behavior has correct methods
+ Class clazz = behavior.getClass();
+ try {
+ Method behaviorMethod = clazz.getMethod(m.getName(), (Class[])m.getParameterTypes());
+ action.setBehaviorMethod(behaviorMethod);
+ behaviorMethod.setAccessible(true);
+ } catch (SecurityException e) {
+ throw new RuntimeException("Your Behavior class seems to be too secure. " +
+ "I can't reflect on it and call getClass on it's class object");
+ } catch (NoSuchMethodException e) {
+ String methodSig = MessageHelper.getMethodSignature(m, "");
+ throw new IllegalArgumentException("You Behavior class is missing the method='"+methodSig);
+ }
+
+ try {
+ Method clonerMethod = clazz.getMethod(m.getName()+"Cloner", (Class[])m.getParameterTypes());
+ action.setClonerMethod(clonerMethod);
+ if(!Object[].class.isAssignableFrom(clonerMethod.getReturnType()))
+ throw new IllegalArgumentException("Method="+clonerMethod+" does not return Object[] which it must do");
+ clonerMethod.setAccessible(true);
+ } catch (SecurityException e) {
+ throw new RuntimeException("Your Behavior class seems to be too secure. " +
+ "I can't reflect on it and call getClass on it's class object");
+ } catch (NoSuchMethodException e) {
+ String methodSig = MessageHelper.getMethodSignature(m, "Cloner");
+ throw new IllegalArgumentException("You Behavior class is missing the method='"+methodSig);
+ }
}
***************
*** 536,540 ****
private void addToActionList(Action action, String method, Class... argTypes) {
! checkMethod(method, argTypes);
List<Action> l = methodToReturnVal.get(method);
if(l == null) {
--- 566,571 ----
private void addToActionList(Action action, String method, Class... argTypes) {
! Method m = checkMethod(method, argTypes);
! action.setMethod(m);
List<Action> l = methodToReturnVal.get(method);
if(l == null) {
***************
*** 553,558 ****
* @param o
* @return
*/
! private Object[] clone(String method, Object[] params) {
if(params == null)
return null;
--- 584,590 ----
* @param o
* @return
+ * @throws Throwable
*/
! private Object[] clone(String method, Object[] params) throws Throwable {
if(params == null)
return null;
***************
*** 569,573 ****
if(action instanceof BehaviorInfo) {
BehaviorInfo behavior = (BehaviorInfo)action;
! return behavior.runClonerMethod();
}
--- 601,605 ----
if(action instanceof BehaviorInfo) {
BehaviorInfo behavior = (BehaviorInfo)action;
! return behavior.runClonerMethod(params);
}
***************
*** 581,590 ****
private void verifyMethodsExist(String[] methods) {
for(int i = 0; i < methods.length; i++) {
! MethodVerifier.verifyMethod(getClasses(), false, methods[i]);
}
}
! private void checkMethod(String method, Class[] argTypes) {
! MethodVerifier.verifyMethod(getClasses(), true, method, argTypes);
}
}
--- 613,622 ----
private void verifyMethodsExist(String[] methods) {
for(int i = 0; i < methods.length; i++) {
! MethodVerifier.getMethod(getClasses(), false, methods[i]);
}
}
! private Method checkMethod(String method, Class[] argTypes) {
! return MethodVerifier.getMethod(getClasses(), true, method, argTypes);
}
}
Index: MethodVerifier.java
===================================================================
RCS file: /cvsroot/mocklib/mocklib3/input/javasrc/biz/xsoftware/mock/impl/MethodVerifier.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** MethodVerifier.java 10 Sep 2006 20:45:05 -0000 1.1
--- MethodVerifier.java 10 Sep 2006 22:35:21 -0000 1.2
***************
*** 7,12 ****
import biz.xsoftware.mock.MockObject;
! public class MethodVerifier {
! private final static Logger log = Logger.getLogger(MethodVerifier.class.getName());
private static boolean paramsMatch(Method method, Class[] argTypes) {
--- 7,14 ----
import biz.xsoftware.mock.MockObject;
! public final class MethodVerifier {
! private static final Logger log = Logger.getLogger(MethodVerifier.class.getName());
!
! private MethodVerifier() {}
private static boolean paramsMatch(Method method, Class[] argTypes) {
***************
*** 36,40 ****
}
! private static boolean methodExistInThisClass(Class c, boolean isVerifyArgs, String method, Class... argTypes) {
Method[] methods = c.getMethods();
for(int i = 0; i < methods.length; i++) {
--- 38,42 ----
}
! private static Method methodExistInThisClass(Class c, boolean isVerifyArgs, String method, Class... argTypes) {
Method[] methods = c.getMethods();
for(int i = 0; i < methods.length; i++) {
***************
*** 43,64 ****
if(method.equals(methods[i].getName())) {
if(!isVerifyArgs)
! return true;
else if(paramsNotNeedMatch(c, methods[i]))
! return true;
else if(paramsMatch(methods[i], argTypes))
! return true;
}
}
! return false;
}
! static void verifyMethod(Class[] classes, boolean isVerifyArgs, String method, Class ... argTypes) {
if(method == null)
throw new IllegalArgumentException("method parameter cannot be null");
else if(MockObject.ANY.equals(method) || MockObject.NONE.equals(method))
! return;
else if(classes == null)
! return;
String classNames = "";
--- 45,66 ----
if(method.equals(methods[i].getName())) {
if(!isVerifyArgs)
! return methods[i];
else if(paramsNotNeedMatch(c, methods[i]))
! return methods[i];
else if(paramsMatch(methods[i], argTypes))
! return methods[i];
}
}
! return null;
}
! static Method getMethod(Class[] classes, boolean isVerifyArgs, String method, Class ... argTypes) {
if(method == null)
throw new IllegalArgumentException("method parameter cannot be null");
else if(MockObject.ANY.equals(method) || MockObject.NONE.equals(method))
! return null;
else if(classes == null)
! return null;
String classNames = "";
***************
*** 66,71 ****
if(log.isLoggable(Level.FINEST))
log.finest("class="+classes[i].getName());
! if(methodExistInThisClass(classes[i], isVerifyArgs, method, argTypes))
! return;
classNames += "\n"+classes[i];
}
--- 68,74 ----
if(log.isLoggable(Level.FINEST))
log.finest("class="+classes[i].getName());
! Method m = methodExistInThisClass(classes[i], isVerifyArgs, method, argTypes);
! if(m != null)
! return m;
classNames += "\n"+classes[i];
}
Index: MessageHelper.java
===================================================================
RCS file: /cvsroot/mocklib/mocklib3/input/javasrc/biz/xsoftware/mock/impl/MessageHelper.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** MessageHelper.java 10 Sep 2006 20:45:05 -0000 1.1
--- MessageHelper.java 10 Sep 2006 22:35:21 -0000 1.2
***************
*** 3,6 ****
--- 3,7 ----
import java.io.PrintWriter;
import java.io.StringWriter;
+ import java.lang.reflect.Method;
import java.util.List;
import java.util.Set;
***************
*** 12,15 ****
--- 13,24 ----
private MessageHelper() {}
+ public static String getMethodSignature(Method method, String postfix) {
+ String methodSig = "public "+method.getReturnType()+" "+method.getName()+postfix+"(";
+ for(Class c : method.getParameterTypes()) {
+ methodSig += c.getName()+", ";
+ }
+ return methodSig.substring(0, methodSig.length()-2)+")";
+ }
+
public static String putTogetherReason(String[] methods, Set<String> ignorables, List methodsCalled, String lastLine) {
String reason = "\nMethods you expected...\n";
|