/*
* Copyright 2002-2006 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
*
* http://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 org.springframework.mock.easymock;
import org.easymock.MockControl;
/**
* Makes those tests that require a <b>single</b> (scalar) EasyMock mock
* control and object easier to author.
*
* @author Rick Evans
* @since 2.0
*/
public abstract class AbstractScalarMockTemplate {
private static final int NORMAL = 0;
private static final int NICE = 1;
private static final int STRICT = 2;
private Class mockInterface;
private int mode = NORMAL;
/**
* Creates a new instance of the {@link AbstractScalarMockTemplate} class.
*/
protected AbstractScalarMockTemplate() {
}
/**
* Creates a new instance of the {@link AbstractScalarMockTemplate} class.
* @param mockInterface the interface that is to be mocked
*/
protected AbstractScalarMockTemplate(Class mockInterface) {
this.mockInterface = mockInterface;
}
/**
* Creates a new instance of the {@link AbstractScalarMockTemplate} class.
* @param mockInterface the interface that is to be mocked
* @param nice <code>true</code> if a "nice" mock control is to be created;
* <code>false</code> if a "strict" control is to be created
*/
protected AbstractScalarMockTemplate(Class mockInterface, boolean nice) {
this.mockInterface = mockInterface;
this.mode = nice ? NICE : STRICT;
}
/**
* Sets the interface that is to be mocked.
* @param mockInterface the interface that is to be mocked
*/
public void setMockInterface(Class mockInterface) {
this.mockInterface = mockInterface;
}
/**
* Gets the interface that is to be mocked.
* @return the interface that is to be mocked
*/
public Class getMockInterface() {
return mockInterface;
}
/**
* Setup any expectations for the test.
* <p>The default implementation is a no-op; i.e. no expectations are set.
* @param mockControl the EasyMock {@link org.easymock.MockControl} for the mocked object
* @param mockObject the mocked object
* @throws Exception if calling methods on the supplied <code>mockObject</code>
* that are declared as throwing one more exceptions (just here to satisfy the compiler really).
*/
public void setupExpectations(MockControl mockControl, Object mockObject) throws Exception {
}
/**
* Do the EasyMock-driven test.
* <p>This is the driving template method, and should not typically need to overriden.
* @throws Exception if an exception is thrown during testing
*/
public void test() throws Exception {
MockControl mockControl = createMockControl();
Object mockObject = mockControl.getMock();
setupExpectations(mockControl, mockObject);
mockControl.replay();
doTest(mockObject);
mockControl.verify();
}
/**
* Do the actual test using the supplied mock.
* @param mockObject the mocked object
* @throws Exception if an exception is thrown during the test logic
*/
public abstract void doTest(Object mockObject) throws Exception;
/**
* Create a {@link org.easymock.MockControl} for the mocked interface.
* @return a {@link org.easymock.MockControl} for the mocked interface
*/
protected MockControl createMockControl() {
return this.mode == NORMAL
? MockControl.createControl(this.getMockInterface())
: this.mode == NICE
? MockControl.createNiceControl(this.getMockInterface())
: MockControl.createStrictControl(this.getMockInterface());
}
}