I have a demo project which tries to respect strictly clean/onion/hexagonal architecture. Here is how I configure ArchUnit test :
@AnalyzeClasses(packages ="fr.tristan.demoassurance", importOptions = {ImportOption.DoNotIncludeTests.class, ExcludeConfig.class})
public class ArchitectureTest {
@ArchTest
public static final ArchRule onionArchitectureRule = onionArchitecture()
.domainModels("fr.tristan.demoassurance.domain.entity..")
.domainModels("fr.tristan.demoassurance.domain.event..")
.domainServices("fr.tristan.demoassurance.domain.api..")
.applicationServices("fr.tristan.demoassurance.application.controller")
.adapter("message", "fr.tristan.demoassurance.infrastructure.message..")
.adapter("persistence-mongodb", "fr.tristan.demoassurance.infrastructure.repository.mongodb..")
.adapter("persistence-mysql", "fr.tristan.demoassurance.infrastructure.repository.mysql..")
;
}
ArchUnit complains about one parameter :
was violated (1 times):
Method <fr.tristan.demoassurance.domain.spi.message.MessageQueueSpi.send(fr.tristan.demoassurance.domain.event.PoliceAssuranceEvent)> has parameter of type <fr.tristan.demoassurance.domain.event.PoliceAssuranceEvent> in (MessageQueueSpi.java:0)
Here is the "guilty" method :
package fr.tristan.demoassurance.domain.spi.message;
import fr.tristan.demoassurance.domain.event.PoliceAssuranceEvent;
public interface MessageQueueSpi {
void send(PoliceAssuranceEvent policeAssuranceCreatedEvent);
}
This makes no sense for me because :
I don't see which rule is violated, it's just not explained why a SPI interface should not have a parameter of a domain model type.
I have an other interface in the same
fr.tristan.demoassurance.domain.spi
parent package with asave
method which also have a parameterPoliceAssurance
from "domain models" and ArchUnit doesn't complain about it :
package fr.tristan.demoassurance.domain.spi.repository;
import java.util.List;
import fr.tristan.demoassurance.domain.entity.PoliceAssurance;
import fr.tristan.demoassurance.domain.exception.PoliceAssuranceException;
public interface PoliceAssuranceRepositorySpi {
List<PoliceAssurance> findAll();
PoliceAssurance save(PoliceAssurance policeAssurance) throws PoliceAssuranceException;
PoliceAssurance findById(Integer id) throws PoliceAssuranceException;
void deleteById(Integer id) throws PoliceAssuranceException;
}