Мне нужно избегать вызова аспекта при модульном тестировании класса.
Я работаю с Java 8, весна 4.3.22.RELEASE и mockito.У меня есть @Service и юнит-тест для него.У меня также есть @Aspect, который определяет pointcut для метода в сервисе, и он работает нормально, когда я запускаю свое приложение.Проблема в том, что когда я запускаю свой модульный тест, вызывается аспект, и возникает исключение NullPointerException из-за отсутствия зависимости в аспекте.
Класс обслуживания:
@Service
public class ContactService {
@Autowired
public InContactService(ContactDao contactDao) {
this.contactDao = contactDao;
}
public boolean muteCall(Long contactId) {
return contactDao.muteCall(contactId);
}
}
Сервисный тест:
public class ContactServiceTest {
@Mock
private ContactDao contactDao;
private ContactService contactService;
@Before
public void setUp(){
MockitoAnnotations.initMocks(this);
contactService = new ContactService(contactDao);
}
@Test
public void testMuteCall(){
contactService.muteCall(1L);
}
}
Аспект:
@Aspect
public class ContactAspect {
private MeterRegistry registry;
public void setRegistry(MeterRegistry registry) {
this.registry = registry;
}
@AfterReturning(pointcut = "execution(* com.company.ContactService.muteCall(..))", returning = "retVal")
public void checkReturnContactServiceMuteCall(JoinPoint joinPoint, boolean retVal) {
Object[] args = joinPoint.getArgs();
registry.counter("my.metric.mute_call").increment();
}
}
Контекст приложения:
@Configuration
public class ApplicationContext {
@Bean
public MeterRegistry meterRegistry() {
return new SimpleMeterRegistry();
}
@Bean
public ContactAspect contactAspect() {
ContactAspect aspect = Aspects.aspectOf(ContactAspect.class);
aspect.setRegistry(meterRegistry());
return aspect;
}
}
Я ожидал, что при запуске теста аспект не вызывается.В настоящее время я получаю исключение NullPointerException при запуске теста, поскольку registry
не определено в аспекте.