Hi All,
I am developing a RIFE web application that I am trying to unit test.
When my surefire tests run, RIFE is unable to load Java classes properly.
Here is the related portion of the pom.xml:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludes>
<exclude>**/SACBaseTest.java</exclude>
</excludes>
<systemProperties>
<property>
<name>rife.webapp.path</name>
<value>${basedir}/target/classes</value>
</property>
</systemProperties>
</configuration>
</plugin>
</plugins>
<testResources>
<testResource>
<targetPath>/</targetPath>
<filtering>false</filtering>
<directory>${basedir}/src/main/webapp/WEB-INF/classes</directory>
<includes>
<include>**/*</include>
</includes>
</testResource>
</testResources>
</build>
Before I explain the problem, here is a part of the stacktrace:
com.uwyn.rife.engine.exceptions.ElementImplementationInstantiationException:
The implementation 'net.collab.extranet.sac.elements.SACHome' of element
'manual:SACHome' couldn't be instantiated.
at com.uwyn.rife.engine.ElementFactory.getInstance(
ElementFactory.java:162)
at com.uwyn.rife.engine.ElementInfo.deploy(ElementInfo.java:242)
at com.uwyn.rife.engine.SiteBuilder.setupElements(SiteBuilder.java
:984)
at com.uwyn.rife.engine.SiteBuilder.setupData(SiteBuilder.java:1618)
at com.uwyn.rife.engine.SiteBuilder.finish(SiteBuilder.java:261)
at com.uwyn.rife.engine.SiteBuilder.process(SiteBuilder.java:252)
at com.uwyn.rife.engine.SiteBuilder.getSite(SiteBuilder.java:178)
at net.collab.extranet.sac.svn.SVNAdminCLIWrapperClientTest.setUp(
SVNAdminCLIWrapperClientTest.java:21)
at junit.framework.TestCase.runBare(TestCase.java:125)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(
NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(
DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.codehaus.surefire.battery.JUnitBattery.executeJUnit(
JUnitBattery.java:246)
at org.codehaus.surefire.battery.JUnitBattery.execute(
JUnitBattery.java:220)
at org.codehaus.surefire.Surefire.executeBattery(Surefire.java:204)
at org.codehaus.surefire.Surefire.run(Surefire.java:153)
at org.codehaus.surefire.Surefire.run(Surefire.java:77)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(
NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(
DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.codehaus.surefire.SurefireBooter.run(SurefireBooter.java:104)
at org.apache.maven.test.SurefirePlugin.execute(SurefirePlugin.java
:303)
at org.apache.maven.plugin.DefaultPluginManager.executeMojo(
DefaultPluginManager.java:412)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(
DefaultLifecycleExecutor.java:534)
at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle
(DefaultLifecycleExecutor.java:475)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(
DefaultLifecycleExecutor.java:454)
at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures
(DefaultLifecycleExecutor.java:306)
at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(
DefaultLifecycleExecutor.java:273)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(
DefaultLifecycleExecutor.java:140)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:322)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:115)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:256)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(
NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(
DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java
:315)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java
:430)
at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Caused by: java.lang.NullPointerException
at com.uwyn.rife.engine.ElementFactory.getJavaClass(
ElementFactory.java:100)
at com.uwyn.rife.engine.ElementFactory.getJavaInstance(
ElementFactory.java:124)
at com.uwyn.rife.engine.ElementFactory.getInstance(
ElementFactory.java:153)
... 47 more
So...a little information about the structure. When my Maven application
runs the tests, the target directory looks like this:
target
/classes
/test-classes
/sites
/rep
/templates
RIFE can successfully load the sites/main.xml but RIFE then starts to
instantiate the SACHome object. This object is compiled to target/classes
but RIFE cannot find it. RIFE developers tell me that RIFE's ClassLoader is
being circumvented or is using the same classpath as what the surefire tests
are. How can I get my tests, which include RIFE's engine, to have the same
classpath? I've done everything I can think of. Just to show you all the
surefire classpath:
[DEBUG] Test Classpath :
[DEBUG] /Users/jwhitlock/work/sac/src/web-app/target/test-classes
[DEBUG] /Users/jwhitlock/work/sac/src/web-app/target/classes
[DEBUG] /Users/jwhitlock/work/sac/src/web-app/target/classes
[DEBUG] /Users/jwhitlock/work/sac/src/web-app/target/test-classes
[DEBUG] /Users/jwhitlock/.m2/repository/com/uwyn/rife-jdk15/1.5.1/rife-
jdk15-1.5.1.jar
[DEBUG] /Users/jwhitlock/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar
[DEBUG] /Users/jwhitlock/.m2/repository/commons-io/commons-io/1.2/commons-
io-1.2.jar
[DEBUG] Adding to surefire test classpath:
/Users/jwhitlock/.m2/repository/surefire/surefire/1.4/surefire-1.4.jar
[DEBUG] Adding to surefire test classpath:
/Users/jwhitlock/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar
[DEBUG] Adding to surefire test classpath:
/Users/jwhitlock/.m2/repository/surefire/surefire-booter/1.4/surefire-
booter-1.4.jar
[DEBUG] Adding to surefire test classpath: /usr/local/maven-2.0/core/plexus-
utils-1.1.jar
As you can see, target/classes and target/test-classes are both on the
classpath and should allow RIFE to be able to load classes from
target/classes but is not able to do so.
Take care,
Jeremy