// 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.apache.tapestry5.ioc.test; import org.easymock.*; import org.testng.annotations.AfterMethod; /** * Manages a set of EasyMock mock objects. Used as a base class for test cases. * * Extends from {@link org.testng.Assert} to bring in all the public static assert methods without requiring extra * imports. * * Provides a common mock factory method, {@link #newMock(Class)}. A single <em>standard</em> mock control is used for * all mock objects. Standard mocks do not care about the exact order in which methods are invoked, though they are as * rigorous as strict mocks when checking that parameters are the correct values. * * This base class is created with the intention of use within a TestNG test suite; if using JUnit, you can get the same * functionality using {@link MockTester}. * * This class is thread safe (it uses a thread local to store the mock control). In theory, this should allow TestNG to * execute tests in parallel. * * This class was originally in the tapestry-ioc module as was moved to tapestry-test; the package name was not changed * to ensure backwards compatibility. * * @see org.easymock.EasyMock#createControl() * @see org.apache.tapestry5.ioc.test.MockTester * @deprecated In 5.4, with no replacement */ public class TestBase extends TestUtils { private final MockTester tester = new MockTester(); /** * @return the {@link IMocksControl} for this thread. */ protected final IMocksControl getMocksControl() { return tester.getMocksControl(); } /** * Discards any mock objects created during the test. */ @AfterMethod(alwaysRun = true) public final void discardMockControl() { tester.cleanup(); } /** * Creates a new mock object of the indicated type. The shared mock control does <strong>not</strong> check order, * but does fail on any unexpected method invocations. * * @param <T> * the type of the mock object * @param mockClass * the class to mock * @return the mock object, ready for training */ protected final <T> T newMock(Class<T> mockClass) { return tester.newMock(mockClass); } /** * Switches each mock object created by {@link #newMock(Class)} into replay mode (out of the initial training * mode). */ protected final void replay() { tester.replay(); } /** * Verifies that all trained methods have been invoked on all mock objects (created by {@link #newMock(Class)}, then * switches each mock object back to training mode. */ protected final void verify() { tester.verify(); } /** * Convienience for {@link EasyMock#expectLastCall()} with {@link IExpectationSetters#andThrow(Throwable)}. * * @param throwable * the exception to be thrown by the most recent method call on any mock */ protected static void setThrowable(Throwable throwable) { EasyMock.expectLastCall().andThrow(throwable); } /** * Convienience for {@link EasyMock#expectLastCall()} with * {@link IExpectationSetters#andAnswer(org.easymock.IAnswer)}. * * @param answer * callback for the most recent method invocation */ protected static void setAnswer(IAnswer<?> answer) { EasyMock.expectLastCall().andAnswer(answer); } /** * Convenience for {@link EasyMock#expect(Object)}. * * @param value to expect * @return expectation setter, for setting return value, etc. */ @SuppressWarnings("unchecked") protected static <T> IExpectationSetters<T> expect(T value) { return EasyMock.expect(value); } /** * A factory method to create EasyMock Capture objects. * @return new Capture */ @SuppressWarnings({"UnusedDeclaration"}) protected static <T> Capture<T> newCapture() { return new Capture<T>(); } }