如何避免在测试期间调用 Spring AOP 方面

我需要避免在对类进行单元测试时调用某个方面。


我正在使用 Java 8、spring 4.3.22.RELEASE 和mockito。我有一个@Service 和一个单元测试。我还有一个 @Aspect,它在服务中的方法上定义了切入点,并且当我运行我的应用程序时它工作正常。问题是,当我运行单元测试时,会调用该方面,并由于该方面缺少依赖项而引发 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方面未定义。


慕莱坞森
浏览 108回答 3
3回答

开心每一天1111

我们遇到了同样的问题,并通过在运行测试时禁用属性来修复它。import org.aspectj.lang.annotation.Aspect;import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;@Aspect@ConditionalOnExpression("${aspect.property.enabled:true}")public class AspectClass {测试/资源/application.propertiesaspect.property.enabled=false

沧海一幻觉

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

暮色呼如

我在遗留代码中遇到了这个问题,我想向其中添加集成测试,但不需要或不希望调用这些方面。您的上下文配置中很可能有某个地方告诉应用程序启用方面。无论它在哪里,找到它并禁用它。就我而言,配置是基于 XML 的,因此在applicationContext-services-integration-test.xml为集成测试加载的文件中,我注释掉了它&nbsp;<aop:aspectj-autoproxy />,它绕过了我的测试的所有方面。干杯!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java