1 package groovy.mock;
2
3 import groovy.lang.GroovyObject;
4 import groovy.lang.Closure;
5 import groovy.lang.GroovyObjectSupport;
6
7 import com.mockobjects.Verifiable;
8 import com.mockobjects.dynamic.*;
9
10 /***
11 *
12 * @author Joe Walnes
13 * @author Chris Stevenson
14 * @version $Revision: 1.4 $
15 */
16 public class GroovyMock extends GroovyObjectSupport implements Verifiable {
17
18 private CallBag calls = new CallBag();
19 private CallFactory callFactory = new DefaultCallFactory();
20 private Mock mock = new Mock(I.class);
21
22 interface I {
23 }
24
25 private GroovyObject instance = new GroovyObjectSupport() {
26 public Object invokeMethod(String name, Object args) {
27 return callMethod(name, args);
28 }
29 };
30
31 public Object invokeMethod(String name, Object args) {
32 if (name.equals("verify")) {
33 verify();
34 }
35 else {
36 expectMethod(name, args);
37 }
38 return null;
39 }
40
41 public GroovyObject getInstance() {
42 return instance;
43 }
44
45 public static GroovyMock newInstance() {
46 return new GroovyMock();
47 }
48
49 private void expectMethod(String name, Object args) {
50 ConstraintMatcher constraintMatcher = createMatcher(args);
51 calls.addExpect(
52 callFactory.createCallExpectation(
53 callFactory.createCallSignature(name, constraintMatcher, callFactory.createVoidStub())));
54 }
55
56 private ConstraintMatcher createMatcher(Object args) {
57 if(args.getClass().isArray()) {
58 Object argArray[] = (Object[]) args;
59 if (argArray[0] instanceof Closure) {
60 Closure closure = (Closure) argArray[0];
61 return C.args(new ClosureConstraintMatcher(closure));
62 }
63 }
64 return C.args(C.eq(args));
65 }
66
67 private Object callMethod(String name, Object args) {
68 try {
69 return calls.call(mock, name, new Object[] { args });
70 }
71 catch (Throwable throwable) {
72 throw new RuntimeException(throwable);
73 }
74 }
75
76 public void verify() {
77 calls.verify();
78 }
79
80 }