<!--
   Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information
   regarding copyright ownership.  The ASF licenses this file
   to you 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.
-->

<body>
Provides a mock package for Click, enabling unit testing of Pages and Controls.
<p/>
This package defines the main mock classes but developers only have to be concerned
with two classes namely {@link org.apache.click.MockContainer} and
{@link org.apache.click.MockContext}.
<p/>
The main class developers will use is {@link org.apache.click.MockContainer} which
provides mocking mocking of application pages and controls.
<p/>
The class {@link org.apache.click.MockContext} provides mocking of 
{@link org.apache.click.Control}s and is easier to setup and use than
{@link org.apache.click.MockContainer}.
</body>