【问题标题】:How to avoid spring AOP aspect being called during test如何避免在测试期间调用spring AOP方面
【发布时间】:2019-09-27 16:26:09
【问题描述】:

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

我正在使用 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

【问题讨论】:

  • 我猜你使用SpringRunner 而不是MockitoJUnitRunner。如果您的测试不需要springaspectj,请使用那个。
  • 您正在将您的方面配置为@Bean,为什么您对它被使用感到惊讶?您可以提供一个 Spring 测试配置停用您不需要的方面。如果您想更接近集成测试,您可以像现在一样保留方面,但只需将模拟 MeterRegistry 注入其中,而不是您现在使用的真实。

标签: java spring junit mockito spring-aop


【解决方案1】:

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

检查这个: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多