我需要避免在對類進行單元測試時調用某個方面。我正在使用 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
提交
取消