[ 
https://issues.apache.org/jira/browse/SUREFIRE-1909?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17390844#comment-17390844
 ] 

Christian Kohlschütter commented on SUREFIRE-1909:
--------------------------------------------------

Ah, maybe that's the misunderstanding: I'm fine with my tests being on the 
classpath / in the unnamed module. I understand in some scenarios, you may want 
to modularize your tests, too (then you'd have to move them to a separate test 
package, though). This is not what I want. I want the test classes in the same 
package as the code under test (like it was practice before JPMS, and which is 
still supported in Eclipse when only the code under src/main/java has a 
module-info.java).

This works out of the box, as long as I keep all methods public. And this 
enabled by the existing {{--add-exports}} statemen in 
ModularClasspathForkConfiguration.java.

My proposed solution would be to change that {{--add-exports}} to 
{{--add-opens}}. "add-opens" is like add-exports plus access to package-level 
protected types and methods, which seems to be a good default when no 
module-info.java was specified for the test code under src/test/java.

Again, it solves the problem at least for me, and I don't see any downsides. 
What am I missing?

> Support JUnit 5 reflection access by changing add-exports to add-opens
> ----------------------------------------------------------------------
>
>                 Key: SUREFIRE-1909
>                 URL: https://issues.apache.org/jira/browse/SUREFIRE-1909
>             Project: Maven Surefire
>          Issue Type: Bug
>          Components: JUnit 5.x support
>    Affects Versions: 3.0.0-M5
>            Reporter: Christian Kohlschütter
>            Priority: Major
>         Attachments: surefire-jpms-bug.tar.gz
>
>
> Testing JUnit 5 classes of a JPMS-enabled project with Surefire may fail if a 
> test class (or, for example, an abstract test base class) is not declared 
> "public". I'm seeing the following error:
>  
> {code:java}
> java.lang.reflect.InaccessibleObjectException: Unable to make public static 
> void some.package.SomeClass.setupClass() throws java.io.IOException 
> accessible: module some.module does not "opens some.package" to unnamed 
> module @754ba872{code}
> This could be fixed by adding the recommended "{{opens some.package}}" to the 
> project's module-info.java, however that is undesirable since it changes the 
> project's behavior beyond just unit testing. Adding a secondary "test-only" 
> module-info.java is also counterproductive since not all IDEs support this, 
> and these two files would have to be kept in sync, which is non-trivial.
> An easy fix would be to change the "{{--add-exports-}}" VM parameter that 
> surefire adds automatically to "{{-}}{{add-opens}}" in 
> {{maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ModularClasspathForkConfiguration.java}}
> This bug is particularly bad because PMD now specifically complains about 
> junit5 classes marked as public instead of package-private; see 
> [https://pmd.github.io/2021/05/29/PMD-6.35.0/]



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to