blob: 25c1367e65feb8e3c21ab21f9b4aaf62d0897181 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 by SAP AG, Walldorf.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.ws.jaxws.testutils.jmock;
import java.util.Collection;
import org.jmock.core.Constraint;
import org.jmock.core.DynamicMock;
import org.jmock.core.Formatting;
import org.jmock.core.InvocationMatcher;
import org.jmock.core.MockObjectSupportTestCase;
import org.jmock.core.Stub;
import org.jmock.core.matcher.InvokeAtLeastOnceMatcher;
import org.jmock.core.matcher.InvokeAtMostOnceMatcher;
import org.jmock.core.matcher.InvokeCountMatcher;
import org.jmock.core.matcher.InvokeOnceMatcher;
import org.jmock.core.matcher.TestFailureMatcher;
import org.jmock.core.stub.ReturnIteratorStub;
import org.jmock.core.stub.ReturnStub;
import org.jmock.core.stub.ThrowStub;
/**
* An abstract class from which sub-classing test cases can inherit. This class is equivalent to org.jmock.MockObjectTestCase with the difference that
* id does not provide an implementation to <c>newCoreMock</c> method and thus is not able to create any proxies. The other major difference is that
* this class is parameterized. It should be used as a base class for sub-classes that provide strongly typed mocks. This class also take advantage of
* some of the java 5 sugars. For example "varargs".
*
* @author Hristo Sabev
*
*/
public abstract class AbstractMockObjectTestCase extends MockObjectSupportTestCase
{
public AbstractMockObjectTestCase()
{
}
public AbstractMockObjectTestCase(String name)
{
super(name);
}
/**
* Creates a mock object that mocks the given type. The mock object is named after the type; the exact name is calculated by
* {@link #defaultMockNameForType}.
*
* @param mockedType
* The type to be mocked.
* @return A {@link Mock} object that mocks <var>mockedType</var>.
*/
@SuppressWarnings("unchecked")
public <T> Mock<T> mock(Class mockedType)
{
return mock(mockedType, defaultMockNameForType(mockedType));
}
/**
* Creates a mock object that mocks the given type and is explicitly given a name. The mock object is named after the type; the exact name is
* calculated by {@link #defaultMockNameForType}.
*
* @param mockedType
* The type to be mocked.
* @param roleName
* The name of the mock object
* @return A {@link Mock} object that mocks <var>mockedType</var>.
*/
@SuppressWarnings("unchecked")
public <T> Mock<T> mock(Class mockedType, String roleName)
{
final Mock<T> newMock = new Mock<T>(newCoreMock(mockedType, roleName));
registerToVerify(newMock);
return newMock;
}
protected abstract <T> DynamicMock newCoreMock(Class<T> mockedType, String roleName);
/**
* Calculates
*
* @param mockedType
* @return
*/
public String defaultMockNameForType(Class<?> mockedType)
{
return "mock" + Formatting.classShortName(mockedType);
}
public Stub returnValue(Object o)
{
return new ReturnStub(o);
}
public Stub returnValue(boolean result)
{
return returnValue(new Boolean(result));
}
public Stub returnValue(byte result)
{
return returnValue(new Byte(result));
}
public Stub returnValue(char result)
{
return returnValue(new Character(result));
}
public Stub returnValue(short result)
{
return returnValue(new Short(result));
}
public Stub returnValue(int result)
{
return returnValue(new Integer(result));
}
public Stub returnValue(long result)
{
return returnValue(new Long(result));
}
public Stub returnValue(float result)
{
return returnValue(new Float(result));
}
public Stub returnValue(double result)
{
return returnValue(new Double(result));
}
public Stub returnIterator(Collection<?> collection)
{
return new ReturnIteratorStub(collection);
}
public Stub returnIterator(Object[] array)
{
return new ReturnIteratorStub(array);
}
public Stub throwException(Throwable throwable)
{
return new ThrowStub(throwable);
}
public InvocationMatcher once()
{
return new InvokeOnceMatcher();
}
public InvocationMatcher atLeastOnce()
{
return new InvokeAtLeastOnceMatcher();
}
public InvocationMatcher atMostOnce()
{
return new InvokeAtMostOnceMatcher();
}
public InvocationMatcher exactly(int expectedCount)
{
return new InvokeCountMatcher(expectedCount);
}
public InvocationMatcher never()
{
return new TestFailureMatcher("not expected");
}
public InvocationMatcher never(String errorMessage)
{
return new TestFailureMatcher("not expected (" + errorMessage + ")");
}
/**
* @since 1.0.1
*/
public Stub onConsecutiveCalls(Stub... stubs)
{
return onConsecutiveCalls(stubs);
}
/**
* @since 1.1.0
*/
public Stub doAll(Stub... stubs)
{
return doAll(stubs);
}
public Constraint collectionWithElements(final int expectedCollectionSize, final Object... objects)
{
return new Constraint(){
public boolean eval(Object arg0)
{
final Collection<?> col = (Collection<?>)arg0;
for(Object o : objects)
{
if(!col.contains(o))
{
return false;
}
}
return objects.length == expectedCollectionSize;
}
public StringBuffer describeTo(StringBuffer arg0)
{
return arg0;
}};
}
}