TNG / ArchUnit

A Java architecture test library, to specify and assert architecture rules in plain Java
http://archunit.org
Apache License 2.0
3.18k stars 288 forks source link

OnionArchitecture: "withOptionalLayers" and "because" in the same statement causes that withOptionalLayers has no effect #1185

Closed pedrodelgado81 closed 5 months ago

pedrodelgado81 commented 10 months ago

Hi! I wrote this statement

Architectures.onionArchitecture()
                .domainModels("com.myapp.domain.." )
        .applicationServices("com.myapp.application.port..","com.myapp.application.service..","com.myapp.application.usecase.." )
        .adapter( "adapters","com.myapp.adapters.." ) 
                .withOptionalLayers( true ).
        .because("SOME REASON").check( devClasses );

When I launched test, the output was: Layer 'domain service' is empty

If I remove because( ... ) statement all works fine.

Dependency info

 <dependency>
    <groupId>com.tngtech.archunit</groupId>
    <artifactId>archunit</artifactId>
    <version>1.1.0</version>
    <scope>test</scope>
</dependency>

Update: After debuggin I have seen that after call method public ArchRule because(String reason) optionalLayers variable changes from true to false.

Update 2: The problem is rule.as (ArchRule line 133) call that launch the creation of a new Onion Architecture (@PublicAPI(usage = ACCESS) ) but doesn't initialize the flag optionalLayers. It takes the default value (false).

codecholeric commented 8 months ago

Thanks for raising the issue and providing the analysis!! You're right, this must have been an oversight when the flag was added 🙈 I tried to fix it in https://github.com/TNG/ArchUnit/pull/1226 if you want to take a look...

pedrodelgado81 commented 8 months ago

Thanks for the work! ;)