You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by bu...@apache.org on 2004/08/23 11:05:00 UTC

DO NOT REPLY [Bug 30798] New: - JUnit showoutput implementation grabs System.out and System.err later than it should

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=30798>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=30798

JUnit showoutput implementation grabs System.out and System.err later than it should

           Summary: JUnit showoutput implementation grabs System.out and
                    System.err later than it should
           Product: Ant
           Version: 1.6.2
          Platform: Macintosh
        OS/Version: MacOS X
            Status: NEW
          Severity: Minor
          Priority: Other
         Component: Optional Tasks
        AssignedTo: dev@ant.apache.org
        ReportedBy: jamie@white-mountain.org


org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner creates the
junit.framework.Test instance before grabbing System.out and System.err. As a
result, anything printed to System.out or System.err in the constructor gets
through.

Here's why this is bad. I'm using the Commons Logging classes. When my log4j
instance field is instantiated, it grabs System.out right away, which is before
JUnitTestRunner.run() is called. So, any log output goes around the Ant JUnit
task and right to the console, despite the fact that "showoutput" defaults to false.

I can fix this in my own classes by moving the instantiation of the Log into the
setUp() method of my test case, but StrutsTestCase also makes the logger at
instantiation time, so now all of my test cases print to the same logger and
their output goes to the console anyway. In fact, this is the way that <a
href="http://jakarta.apache.org/commons/logging/guide.html#Developing%20With%20JCL">the
documentation for the commons logger says to do things</a>, so I wouldn't be
surprised if there are more projects out there that do the same thing. So, I
don't think it's reasonable to rely on workarounds. Even so, I've managed to
create a hackish workaround just by making a test case that creates the log in
its setUp() method, and making sure that's the first test case to be run.

The fix seems simple, although I haven't tried it yet. Basically, move the code
that instantiates the test case in JUnitTestRunner from the constructor into the
part of run() right before it calls suite.run().

I looked in the CVS for Ant and the code still works this way. However I've only
tested this with Ant 1.6.2.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org