簡體   English   中英

如何避免在測試期間調用 spring AOP 方面

[英]How to avoid spring AOP aspect being called during test

我需要避免在對 class 進行單元測試時調用某個方面。

我正在使用 Java 8、spring 4.3.22.RELEASE 和 mockito。我有一個 @Service 和一個單元測試。 我還有一個 @Aspect 定義了服務中方法的切入點,當我運行我的應用程序時它工作正常。 問題是當我運行我的單元測試時,方面被調用並且由於方面中缺少依賴項而引發 NullPointerException。

客服class:

@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未在方面中定義。

最好的方法是使用 Spring 配置文件,它允許您有不同的運行方案。

檢查這個: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html

我在遺留代碼中遇到了這個問題,我想向其中添加集成測試,但不需要或不希望調用這些方面。

很可能在您的上下文配置中的某個地方告訴應用程序啟用方面。 無論在哪里,找到它並禁用它。

在我的例子中,配置是基於 XML 的,所以在我的applicationContext-services-integration-test.xml文件為我的集成測試加載時,我注釋掉了<aop:aspectj-autoproxy />並繞過了我的測試的所有方面。

干杯!

我們遇到了同樣的問題,並通過在運行測試時禁用屬性來修復它。

import org.aspectj.lang.annotation.Aspect;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;

@Aspect
@ConditionalOnExpression("${aspect.property.enabled:true}")
public class AspectClass {

測試/資源/application.properties

aspect.property.enabled=false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM