Я решил это с помощью ткачества во время загрузки. Таким образом, переплетение происходит, когда выполняются ваши юнит-тесты (через аргумент командной строки при запуске юнит-тестов), но ваши аспекты не вплетаются в опубликованные артефакты.
Например, я хотел подделать системные часы в моих юнит-тестах, но явно не связываться с ними в живом коде. Вот мой класс аспекта:
@Aspect
public class TweakSystemAspects {
private static long timeOffsetMillis = 0;
public static void advanceTime(int amount, TimeUnit unit) {
timeOffsetMillis += unit.toMillis(amount);
}
@Around("call (long System.currentTimeMillis())")
public long aroundSystemTime(ProceedingJoinPoint joinPoint) throws Throwable {
return ((Long) joinPoint.proceed()) + timeOffsetMillis;
}
}
Очевидно, это используется в юнит-тестах, вызывая метод TweakSystemAspects.advanceTime()
, чтобы имитировать течение времени в системе. Чтобы выполнить переплетение времени загрузки, мне просто нужно было создать файл aop.xml, который определил мои аспекты (и такое переплетение должно происходить во всех классах):
<aspectj>
<aspects>
<aspect name="com.mypackage.TweakSystemAspects"/>
</aspects>
<weaver options="-nowarn -Xlint:ignore"/>
<!-- During testing this was useful, but I didn't want all that output normally. -->
<!--<weaver options="-verbose -showWeaveInfo"/>-->
</aspectj>
Наконец, я внес изменения в свой pom-файл, чтобы объявить зависимость времени выполнения AspectJ и сообщить верному файлу время выполнения ткачества.
<project ...>
...
<properties>
...
<version.aspectj>1.8.10</version.aspectj>
<properties>
<dependencies>
...
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${version.aspectj}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
...
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!-- For Load Time Weaving of our AspectJ helper code -->
<argLine>-javaagent:${settings.localRepository}/org/aspectj/aspectjweaver/${version.aspectj}/aspectjweaver-${version.aspectj}.jar</argLine>
...
</configuration>
</plugin>
</plugins>
</build>
...
</project>