Hi Borut,
> thanks VERY much for the explanations.
> I refactored my code to almost match your recomendation (I did not put
stuff
> from src/main/resources into src/main/java).
Putting the resources in the java tree was the most controversial
suggestion :-) Definitely a personal preference. But useful for people to
know that they do have that choice.
> When running mvn clean test I get:
>
> FAILED: testElementIsOnPage
> java.lang.RuntimeException: Request was not handled:
> 'demo/DayMonthYearDateInputDemo' may not be a valid page name.
> at
org.apache.tapestry5.test.PageTester.renderPage(PageTester.java:177)
> at
> test.si.najdi.tapestry.library.demo.components.
> DayMonthYearDateInputDemo.
> testElementIsOnPage(DayMonthYearDateInputDemo.java:14)
> at
>
org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:74)
What's interesting about this stack trace (reading from the bottom up) is
that TestNG is calling:
test.si.najdi.tapestry.library.demo.components.DayMonthYearDateInputDemo.testElementIsOnPage
So TestNG is calling the demo page and the demo page contains the test...
That's not right.
You need the demo page to just be a simple page providing enough
infrastructure to exercise the component that you want to test.
The test method needs to move into:
test.si.najdi.tapestry.library.components.DayMonthYearDateInputTest.java
So something like this:
DayMonthYearDateInputTest.java
==========================================================
package test.si.najdi.tapestry.library.components;
import org.apache.tapestry5.dom.Document;
import org.testng.Assert;
import org.testng.annotations.Test;
import
test.si.najdi.tapestry.library.base.AbstractT5ComponentsLibraryTest;
public class DayMonthYearDateInputTest extends
AbstractT5ComponentsLibraryTest {
@Test
public void testElementIsOnPage() {
Document page =
tester.renderPage("demo/DayMonthYearDateInputDemo");
Assert.assertNotNull(page.getElementById("h1"));
}
}
DayMonthYearDateInputDemo.java
==========================================================
package test.si.najdi.tapestry.library.demo.components;
public class DayMonthYearDateInputDemo {
}
And you need to make TestNG run that test class (it was trying to run the
page :-) ):
testng.xml
====================
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Najdi.si Tapestry Components Suite" parallel="false"
thread-count="10" annotations="1.5" verbose="2">
<parameter name="tapestry.integration-webapp"
value="src/main/webapp"/>
<test name="DayMonthYearDateInput">
<classes>
<class
name="test.si.najdi.tapestry.library.components.DayMonthYearDateInputTest"/>
</classes>
</test>
</suite>
Hopefully that will do the trick.. but let me know if not.
------------------------------------
Other things:
> Just prior to this error message a list of available components is also
> printed out on the console:
> ......
> demo/DayMonthYearDateInput:
> test.si.najdi.tapestry.library.demo.components.DayMonthYearDateInputDemo
> demo/DayMonthYearDateInputDemo:
> test.si.najdi.tapestry.library.demo.components.DayMonthYearDateInputDemo
>
> Why there are 2 demo components?
I'm guessing here but I think it because of Tapestry's clever naming
system. The name of the page ends in "Demo" and the page is in a "demo"
directory and Tapestry allows an abbreviated URL where the "Demo" can be
ommitted (i.e. /demo/DayMonthYearDateInput). So my guess is that you are
seeing Tapestry register the same page under two URLs: the long one and
the abbreviated one.
> private static final TapestryTester SHARED_TESTER = new
> TapestryTester("demo", DemoModule.class);
> I tried instantiating TapestryTester with all kind of appPackage names I
> could think off.
You actually need to be a bit careful with the appPackage name. If you
give it a name like "app", Tapestry will look for "AppModule" in the
modules package - now this might be OK for you, but also might build a
complex IOC that you don't want just for unit testing. So personally, I
prefer to use a nonsense name (like "xxxxxxx"), because the testing
infrastructure will ignore that, and then I control exactly the set of
modules that I want using the TapestryTester constructor.
- 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.