grails.test.MockClosureProxy Maven / Gradle / Ivy
/*
* Copyright 2008 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package grails.test;
import groovy.lang.Closure;
import groovy.mock.interceptor.LooseExpectation;
import groovy.mock.interceptor.StrictExpectation;
/**
* This closure proxy stores an expectation and checks it before each
* call to the target closure. It is used by the Grails mocking framework.
*
* @author Peter Ledbrook
*/
public class MockClosureProxy extends AbstractClosureProxy {
private static final long serialVersionUID = -1373536726646006925L;
String methodName;
Object expectation;
/**
* Constructor.
* @param target
* @param methodName
* @param expectation
*/
public MockClosureProxy(Closure> target, String methodName, Object expectation) {
super(target);
this.methodName = methodName;
this.expectation = expectation;
if (!(expectation instanceof LooseExpectation) && !(expectation instanceof StrictExpectation)) {
throw new IllegalArgumentException(
"Expectation must be either groovy.mock.interceptor.LooseExpectation or " +
" groovy.mock.interceptor.StrictExpectation (actual class: " +
expectation.getClass() + ")");
}
}
/**
* Checks whether the target "method" is expected or not, on the
* basis that this closure is mocking a method with the name
* methodName
.
* @param args The arguments to the "method" (actually
* the argumetns to the target closure invocation).
*/
@Override
protected void doBeforeCall(Object[] args) {
if (this.expectation instanceof LooseExpectation) {
((LooseExpectation) this.expectation).match(this.methodName);
}
else {
((StrictExpectation) this.expectation).match(this.methodName);
}
}
/**
* Empty implementation.
* @param args The arguments to the target closure.
*/
@Override
protected void doAfterCall(Object[] args) {
// do nothing
}
/**
* Creates a new MockClosureProxy
wrapping the given
* closure.
* @param c The closure to wrap.
* @return the new proxy.
*/
@Override
protected Closure> createWrapper(Closure> c) {
return new MockClosureProxy(c, this.methodName, this.expectation);
}
}