Как избежать вызова аспекта AOP во время теста - PullRequest
2 голосов
/ 27 сентября 2019

Мне нужно избегать вызова аспекта при модульном тестировании класса.

Я работаю с 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 не определено в аспекте.

...