logo       

Re: NullPointerException when invoking JUnit using Groovy Ant under Tomcat: msg#00157

lang.groovy.user

Subject: Re: NullPointerException when invoking JUnit using Groovy Ant under Tomcat


Other than the NullPointerException, the problem exhibits itself whenever you see:

Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 secnull


Note the "secnull" at the end. This indicates that you have somehow removed "line.separator" from the system properties before using the Ant classes.

The Ant method that handles the system properties is org.apache.tools.ant.types.CommandlineJava.setSystem(). It does not transfer the system property defaults. This was a change made between Ant 1.4 and Ant 1.5 (2/15/2002).

John



Trevor Butler Trevor.Butler-at-sas.com |groovy| wrote:

Just wanted to let the Groovy User community know that my colleague, John Lewis, solved this problem.
The issue was not Groovy, but rather the way I was setting system properties to pass into Junit. Here was the method I was using to set system properties - I got the idea from Googling around online:
static public void setSysProperties(String key1, String val1, String key2, String val2, String key3, String val3 )
{
// Read current properties from the System environment
Properties p = System.getProperties();
p.setProperty(key1, val1);
p.setProperty(key2, val2);
p.setProperty(key3, val3);
// set the system properties
System.setProperties(p);
}

John changed the line:

Properties p = new Properties(System.getProperties())

To:

Properties p = System.getProperties()

The Properies constructor that was used takes a properties object as a parameter. That
parameter sets the defaults but does not actually add those as properties. Later, Ant
code (not Groovy) enumerates over the system properties and adds more properties similar
to what I was trying to do. Because all of the "old" system properties are
just defaults, they do not show up in the enumeration. So, they are not passed on.

I guess this could be viewed as an Ant deficiency that was made visible by what I was doing using the Properties constructor.
Here is the Ant code:

sys = System.getProperties();
Properties p = new Properties();
for (Enumeration e = sys.keys(); e.hasMoreElements();) {
Object o = e.nextElement();
p.put(o, sys.get(o));
}

They should enumerate with sys.propertyNames() instead. They would get the
defaults if they did that.

Regards,
Trevor Butler


-----Original Message-----
From: Trevor Butler [mailto:Trevor.Butler-LVvIjLR0h5w@xxxxxxxxxxxxxxxx] Sent: Friday, October 22, 2004 4:39 PM
To: user-i9PBDF1N6cxnkHa44VUL00B+6BGkLq7r@xxxxxxxxxxxxxxxx
Subject: [groovy-user] NullPointerException when invoking JUnit using Groovy
Ant under Tomcat


The subject line is a mouthful! Here is what I am doing:

I needed a means to invoke JUnit within a web container within the same jvm, so that I can pass system properties to the Junit test. Someone in my department suggested using Groovy's Ant integration to invoke JUnit, which I have done. When groovy invokes Junit, I get a nasty Exception. Here is a snippet of the Tomcat console:
[junit] Running com.mycompany.MyTest
[junit] Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 secnull
java.lang.NullPointerException
at java.io.Writer.write(Writer.java:126)
at
org.apache.tools.ant.util.DOMElementWriter.write(DOMElementWriter.java:113)
at
org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter.endTestSuite(XMLJUnitResultFormatter.java:135)
at
org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.fireEndTestSuite(JUnitTestRunner.java:440)
at
org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:313)
at
org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.executeInVM(JUnitTask.java:954)
at
org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.execute(JUnitTask.java:626)
at
org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.execute(JUnitTask.java:600)
at org.apache.tools.ant.Task.perform(Task.java:364)
at groovy.util.AntBuilder.nodeCompleted(AntBuilder.java:115)
at groovy.util.BuilderSupport.doInvokeMethod(BuilderSupport.java:160)
at groovy.util.BuilderSupport.invokeMethod(BuilderSupport.java:85)
at org.codehaus.groovy.runtime.Invoker.invokeMethod(Invoker.java:130)
at
org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:106)
at com.sas.junit.JUnitInvoker.runJUnit(C:\JUnitInvoker.groovy:29)
at
gjdk.com.sas.junit.JUnitInvoker_GroovyReflector.invoke(JUnitInvoker_GroovyReflector.java)
at groovy.lang.MetaMethod.invoke(MetaMethod.java:110)
at groovy.lang.MetaClass.doMethodInvoke(MetaClass.java:1398)
at groovy.lang.MetaClass.invokeMethod(MetaClass.java:319)
at
gjdk.groovy.lang.MetaClass_GroovyReflector.invoke(MetaClass_GroovyReflector.java)
at groovy.lang.MetaMethod.invoke(MetaMethod.java:110)
at groovy.lang.MetaClass.doMethodInvoke(MetaClass.java:1398)
at groovy.lang.MetaClass.invokeMethod(MetaClass.java:319)
at org.codehaus.groovy.runtime.Invoker.invokeMethod(Invoker.java:143)
at
org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:106)
at com.mycompany.junit.JUnitInvoker.invokeMethod(C:\JUnitInvoker.groovy)
at com.mycompany.junit.caller.InvokerCaller.callJUnitInvoker(Unknown
Source)
at
com.mycompany.testserver.handler.EmpirixHandler.handleRequest(EmpirixHandler.java:150)
at
com.mycompany.testserver.RemoteControlTestService.handleRequest(RemoteControlTestService.java:201)
at
com.mycompany.testserver.RemoteControlTestService.doPost(RemoteControlTestService.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at
org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)


From the following post, it appears that the problem is caused by the Junit
testcase name being null:
http://www.diasparsoftware.com/weblog/archives/00000004.html

Well, I think the name is being passed in by groovy (or Ant), when it creates the Junit testcase (using the TestCase constructor).
Does anyone know if this is a Groovy bug, or if perhaps it can be fixed by
configuration changes, etc? I have been trying to figure it out for over two
days.

Thanks,
Trevor







<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise