为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕莱坞森 2023-09-06 15:46:55
我需要避免在对类进行单元测试时调用某个方面。我正在使用 Java 8、spring 4.3.22.RELEASE 和mockito。我有一个@Service 和一个单元测试。我还有一个 @Aspect,它在服务中的方法上定义了切入点,并且当我运行我的应用程序时它工作正常。问题是,当我运行单元测试时,会调用该方面,并由于该方面缺少依赖项而引发 NullPointerException。服务等级:@Servicepublic 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);  }}方面:@Aspectpublic 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();    }}应用背景:@Configurationpublic 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方面未定义。
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

我们遇到了同样的问题,并通过在运行测试时禁用属性来修复它。


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


查看完整回答
反对 回复 2023-09-06
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

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

查看完整回答
反对 回复 2023-09-06
?
暮色呼如

TA贡献1853条经验 获得超9个赞

我在遗留代码中遇到了这个问题,我想向其中添加集成测试,但不需要或不希望调用这些方面。

您的上下文配置中很可能有某个地方告诉应用程序启用方面。无论它在哪里,找到它并禁用它。

就我而言,配置是基于 XML 的,因此在applicationContext-services-integration-test.xml为集成测试加载的文件中,我注释掉了它 <aop:aspectj-autoproxy />,它绕过了我的测试的所有方面。

干杯!


查看完整回答
反对 回复 2023-09-06
  • 3 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信