我需要避免在对类进行单元测试时调用某个方面。我正在使用 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
暮色呼如
TA贡献1853条经验 获得超9个赞
我在遗留代码中遇到了这个问题,我想向其中添加集成测试,但不需要或不希望调用这些方面。
您的上下文配置中很可能有某个地方告诉应用程序启用方面。无论它在哪里,找到它并禁用它。
就我而言,配置是基于 XML 的,因此在applicationContext-services-integration-test.xml
为集成测试加载的文件中,我注释掉了它 <aop:aspectj-autoproxy />
,它绕过了我的测试的所有方面。
干杯!
添加回答
举报
0/150
提交
取消