Hi Borut,

It looks like the T5 page class also contain the tests.

You need to have separate classes for the page and for the tests. To test 
components I create pages that I call "demo" pages (because they 
demonstrate the component).

Also I would advise putting the test class in a different package (I know 
it's in a different source tree - but the java package is the same) as 
that will stop T5 thinking the test class is part of the T5 
pages/components/mixins classes. T5 uses a special classloader for those 
classes in order to implement its live reloading functionality - so best 
to keep other things away from that magic.

So, my project layout would look like the following (notice that some of 
this is a very personal choice, but I'll present everything and you can 
choose what you like):

+---src
     +---main
     ¦   +---java
     ¦   ¦   +---si
     ¦   ¦       +---najdi
     ¦   ¦           +---tapestry
     ¦   ¦               +---library
     ¦   ¦                   +---components
     ¦   ¦                   ¦       DayMonthYearDateInput.java
     ¦   ¦                   ¦       day-month-year-date-input-error.png
     ¦   ¦                   ¦       day-month-year-date-input.png
     ¦   ¦                   ¦       DayMonthYearDateInput.properties
     ¦   ¦                   ¦       DayMonthYearDateInput.tml
     ¦   ¦                   ¦       DayMonthYearDateInput.xdoc
     ¦   ¦                   ¦       
DayMonthYearDateInput_sl_SI.properties
     ¦   ¦                   ¦
     ¦   ¦                   +---mixins     
     ¦   ¦                   ¦       ZoneUpdater.java
     ¦   ¦                   ¦       ZoneUpdater.js
     ¦   ¦                   ¦
     ¦   ¦                   +---services     
     ¦   ¦                   ¦       LibraryModule.java
     ¦   ¦                   ¦       TestInfrastructureModule.java
     ¦   ¦                   ¦
     ¦   ¦                   +---util
     ¦   ¦                           IntegerOptionModel.java
     ¦   ¦                           IntegerSelectModel.java
     ¦   ¦                           IntegerValueEncoder.java
     ¦   ¦                           Month.java
     ¦   ¦
     ¦   +---resources
     ¦           log4j.properties
     |
     +---site
     ¦   ¦   site.xml
     ¦   ¦
     ¦   +---xdoc
     ¦           index.xml
     ¦
     +---test
         +---conf
         ¦       testng.xml
         |
         +---java
             +---test
                +---si                 
                    +---najdi
                        +---tapestry                         
                            +---library                             
                                +---base
                                ¦       
AbstractT5ComponentsLibraryTest.java
                                ¦
                                +---demo
                                ¦   ¦   DemoModule.java
                                ¦   +---components
                                ¦           DayMonthYearDateInputDemo.tml
                                ¦           DayMonthYearDateInputDemo.java
                                +---components
                                            DayMonthYearDateInputTest.java


Things to note:

a) I've put all the component's resources alongside the java class (in 
src/main/java/si/najdi/tapestry/library/components). Personally, I find it 

much easier to work with resources that are associated with a class if I 
do this. 

To make Maven allow this you need to add the following to your pom (you 
may need to tweak the 'includes' and 'excludes' rules depending on what 
you have in your source folders):
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <excludes>
                <exclude>**/*.java</exclude>
            </excludes>
            <filtering>false</filtering>
        </resource>
    </resources>

    <testResources>
        <testResource>
            <directory>src/test/resources</directory>
            <filtering>false</filtering>
        </testResource>
        <testResource>
            <directory>src/test/java</directory>
            <excludes>
                <exclude>**/*.java</exclude>
            </excludes>
            <filtering>false</filtering>
        </testResource>
    </testResources>



b) I put all the tests in a parallel package hierarchy prefixed with 
"test". So the tests for components in:
   si.najdi.tapestry.library.components
will be found in the package:
   test.si.najdi.tapestry.library.components

This makes it easy to find the tests but also keeps them separate from a 
Java runtime point-of-view.

FYI, the Eclipse plugin MoreUnit (http://moreunit.sourceforge.net/) makes 
it easy to jump between classes and tests and understands this convention.


c) For components, I create "demo" pages in a parallel hierarchy near the 
test package. So the demo pages for:
   si.najdi.tapestry.library.components
will be found in the package:
   test.si.najdi.tapestry.library.demo.components

This choice makes the demo pages and the tests fairly near each other in a 

package explorer view in your IDE. You can't put them in the same package 
because of T5's special classloading for pages/components/mixins.


When running the tests, I create the IOC container with an additional 
module (give this class as a parameter when you create your 
TapestryTester):

    package test.si.najdi.tapestry.library.demo;

    public class DemoModule {
        public static void contributeComponentClassResolver(
                  Configuration<LibraryMapping> configuration) {
            configuration.add(new LibraryMapping("demo",
                DemoModule.class.getPackage().getName()));
        }
    }

And I would render the page like this:
    private Document renderPage() {
        return tester.renderPage("demo/DayMonthYearDateInputDemo");
    }


Hope you find that useful.

- Paul



---

This e-mail may contain confidential and/or privileged information. If you are 
not the intended recipient (or have received this e-mail in error) please 
notify the sender immediately and delete this e-mail. Any unauthorized copying, 
disclosure or distribution of the material in this e-mail is strictly forbidden.

Please refer to http://www.db.com/en/content/eu_disclosures.htm for additional 
EU corporate and regulatory disclosures.

Reply via email to