Maven 1.x JCoverage Plugin

Inner/anonymous classes report uncomplete

Details

  • Type: Bug Bug
  • Status: Closed Closed
  • Priority: Major Major
  • Resolution: Fixed
  • Affects Version/s: 1.0.8
  • Fix Version/s: 1.1
  • Component/s: None
  • Labels:
    None
  • Number of attachments :
    1

Description

Since I use maven (1.0b8 or so) up to now (1.0) I observe that the JCoverage plugin does produce wrong results for inner/anonymous classes. I.e. I have got a class called ClassOne, which has an anonymouls inner class. The two classes are displayed in the coverage report as ClassOnewith 44% and ClassOne$1 with 0% tested, which is correct. The underlining reference to the html-file is in both cases the same. However, the file displays only the coverage of the inner class, the outer class does not contain any counts, red or green lines.

I doublechecked whether the coverage.xml file contains the corresponding values, which it does. So it seems to be a problem of the plugin itself.

Activity

Hide
Michael Heuer added a comment -

I'm not smart enough to set up a development environment for maven plugins, but I believe the following changes to CoverageReport.java will do the trick:

In coverage.xml, you see

<coverage src="...
<class name="org.mydomain.MyClass$InnerClass0">
<file name="org/mydomain/MyClass.java">
<line ...
</class>
<class name="org.mydomain.MyClass$InnerClass1">
<file name="org/mydomain/MyClass.java">
<line ...
</class>
<class name="org.mydomain.MyClass">
<file name="org/mydomain/MyClass.java">
<line ...
</class>

But all three html reports are written to a file org/mydomain/MyClass.html.

At line numbers 283, 334, 357, and 367-375 in CoverageReport.java a file name based on Clazz.getName() instead of Clazz.getFile() should be created, e.g.

org/mydomain/MyClass$InnerClass0.html
org/mydomain/MyClass$InnerClass1.html
org/mydomain/MyClass.html

I'll leave the simple code fix to someone who knows how to build and deploy maven plugins.

Show
Michael Heuer added a comment - I'm not smart enough to set up a development environment for maven plugins, but I believe the following changes to CoverageReport.java will do the trick: In coverage.xml, you see <coverage src="... <class name="org.mydomain.MyClass$InnerClass0"> <file name="org/mydomain/MyClass.java"> <line ... </class> <class name="org.mydomain.MyClass$InnerClass1"> <file name="org/mydomain/MyClass.java"> <line ... </class> <class name="org.mydomain.MyClass"> <file name="org/mydomain/MyClass.java"> <line ... </class> But all three html reports are written to a file org/mydomain/MyClass.html. At line numbers 283, 334, 357, and 367-375 in CoverageReport.java a file name based on Clazz.getName() instead of Clazz.getFile() should be created, e.g. org/mydomain/MyClass$InnerClass0.html org/mydomain/MyClass$InnerClass1.html org/mydomain/MyClass.html I'll leave the simple code fix to someone who knows how to build and deploy maven plugins.
Hide
Stephen Colebourne added a comment -

PATCH to fix the problem described here which affects all inner classes.

Show
Stephen Colebourne added a comment - PATCH to fix the problem described here which affects all inner classes.
Hide
Michael Heuer added a comment -

The patch looks good, thank you Stephen.

Show
Michael Heuer added a comment - The patch looks good, thank you Stephen.
Hide
Emmanuel Venisse added a comment -

Applied. Thanks.

Show
Emmanuel Venisse added a comment - Applied. Thanks.
Hide
Julie Cowart added a comment -

This fix doesn't actually appear to have been applied to CVS.

Show
Julie Cowart added a comment - This fix doesn't actually appear to have been applied to CVS.
Hide
Erik Forkalsrud added a comment -

I tried the patch and it works pretty well. However, the additional html files it generates don't seem to be linked from the allcallses-frame.html and package-frame.html files. I was able to fix that by using the getShortFileName() method on line 187 (CoverageReport.java) and remove the if-statement following it, so all classes get listed. I updated the patch, but I havent figured out how to put it in JIRA. (it's at http://forkalsrud.org/~erik/JCoveragePatch2.txt for now)

Also, setting up a developer environment for maven plugins turned out to be pretty simple. I did this using eclipse with these steps:

1 - File->Import... – "Checkout Projects from CVS"
2 - Select: "Create a new repository location"
3 - Enter values:
Host == cvs.apache.org
Repository Path == /home/cvspublic
User == anoncvs
Connection Type == pserver
4 - Select: User specified module name: "maven-plugins/jcoverage"
5 - Select: "Check out as project configured using the New Project Wizard"
6 - Select: "HEAD" and "Finish"
7 - Now, go though the regular eclipse project wizard.
I use MevenIde (http://mevenide.codehaus.org/) to add "Maven Nature" to
the project and cofigure all jars through the POM Synchronizer
8 - Go through steps 1-7, again, but this time, check out the module
"maven-plugins/plugin-parent"
(Also, you can "use an existing repoitory location" this time i.e. the
one you created in step 3)
9 - Right-click on CoverageReport.java and select: Team->Apply Patch...
to apply JCoveragePatch.txt
10 - Go to your eclipse workspace folder where the jcoverage plugin is,
and type "maven plugin:install" to try out your code changes.

Show
Erik Forkalsrud added a comment - I tried the patch and it works pretty well. However, the additional html files it generates don't seem to be linked from the allcallses-frame.html and package-frame.html files. I was able to fix that by using the getShortFileName() method on line 187 (CoverageReport.java) and remove the if-statement following it, so all classes get listed. I updated the patch, but I havent figured out how to put it in JIRA. (it's at http://forkalsrud.org/~erik/JCoveragePatch2.txt for now) Also, setting up a developer environment for maven plugins turned out to be pretty simple. I did this using eclipse with these steps: 1 - File->Import... – "Checkout Projects from CVS" 2 - Select: "Create a new repository location" 3 - Enter values: Host == cvs.apache.org Repository Path == /home/cvspublic User == anoncvs Connection Type == pserver 4 - Select: User specified module name: "maven-plugins/jcoverage" 5 - Select: "Check out as project configured using the New Project Wizard" 6 - Select: "HEAD" and "Finish" 7 - Now, go though the regular eclipse project wizard. I use MevenIde (http://mevenide.codehaus.org/) to add "Maven Nature" to the project and cofigure all jars through the POM Synchronizer 8 - Go through steps 1-7, again, but this time, check out the module "maven-plugins/plugin-parent" (Also, you can "use an existing repoitory location" this time i.e. the one you created in step 3) 9 - Right-click on CoverageReport.java and select: Team->Apply Patch... to apply JCoveragePatch.txt 10 - Go to your eclipse workspace folder where the jcoverage plugin is, and type "maven plugin:install" to try out your code changes.

People

Vote (1)
Watch (2)

Dates

  • Created:
    Updated:
    Resolved: