【发布时间】: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。如果您的测试不需要spring或aspectj,请使用那个。 -
您正在将您的方面配置为
@Bean,为什么您对它被使用感到惊讶?您可以提供一个 Spring 测试配置停用您不需要的方面。如果您想更接近集成测试,您可以像现在一样保留方面,但只需将模拟MeterRegistry注入其中,而不是您现在使用的真实。
标签: java spring junit mockito spring-aop