Рекомендации Spring AOP не применяются для юнит-тестов.Кажется, что все работает нормально во время нормального выполнения и интеграционных тестов, но не применяется во время выполнения модульных тестов.
Относительно новичок в Spring и некоторое время боролся с этой проблемой.Похоже, некоторые проблемы с конфигурацией.Пробовал с разными бегунами, но не повезло.Также пытался интегрировать с AspectJWeaver для создания времени компиляции, но столкнулся со многими проблемами компиляции в устаревшей базе кода, которые я отступил.
Юнит-тест
@RunWith(SpringRunner.class)
@SpringBootTest
@EnableAspectJAutoProxy
public class UserServiceImpl
private UserServiceImpl userServiceSpy;
@Mock
private UserDao userDao;
@Mock
private MembershipDao membershipDao;
@Mock
private Service1 service1;
@Mock
private Service2 service2;
@Mock
private TroubleshootingLogService troubleshootingLogService;
@Before
public void setup() {
UserServiceImpl userService = new UserServiceImpl(userDao, membershipDao,service1, service2, <param1>, <param2>);
userServiceSpy = spy(userService)
// some other variables inits...
}
// All the unit tests.
Интеграционный тест
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestExecutionListeners(value = {FlywayTestExecutionListener.class}, mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS)
@FlywayTest
@ActiveProfiles("local")
public class UserServiceIntegrationTest {
@ClassRule
public static final WireMockClassRule wireMockRule = new WireMockClassRule(wireMockConfig().dynamicPort());
@Autowire
private UserDao userDao;
@Autowire
private MembershipDao membershipDao;
@Autowire
private Service1 service1;
@Autowire
private Service2 service2;
@Before
public void init(){
//clean up persisted test states
}
// All integration tests
}
Аспект
@Aspect
@Component
@Order(1)
public class UserExceptionLoggingAdvisor extends AbstractExceptionLoggingAdvisor {
private static final Logger LOGGER = LoggerFactory.getLogger(UserExceptionLoggingAdvisor.class);
@Around("@annotation(LogException) && args(directoryId, userId, userToUpdate)")
public Object handleException(ProceedingJoinPoint joinPoint, String directoryId, String userId, ExternalUser userToUpdate) throws Throwable {
LOGGER.debug("Advising execution to handle possible ScimException");
}
Когда у нас есть точка останова в классе Aspect, в строке private static final Logger LOGGER = LoggerFactory.getLogger(UserExceptionLoggingAdvisor.class);
, тестовый модуль прерывается.Но он не нарушает фактический совет @Around для модульных тестов, в то время как он подходит для интеграционных тестов.
Может кто-нибудь посоветовать мне, как решить эту проблему.