package net.greencoding.thysdrus.circuitbreaker.springaop; import net.greencoding.thysdrus.circuitbreaker.annotation.MonitoredByCircuitBreakerBean; import net.greencoding.thysdrus.circuitbreaker.core.CircuitBreakerRegistry; import net.greencoding.thysdrus.circuitbreaker.core.CircuitBreakerRegistryFactory; import net.greencoding.thysdrus.circuitbreaker.core.model.CircuitBreakerStatus; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "file:src/test/resources/test-context.xml" }) public class AopAutoproxyTest { @Autowired private ApplicationContext context; private CircuitBreakerRegistry cbr = CircuitBreakerRegistryFactory.getSingelton(); @Test public void testAutoproxy() { BeanInterface abean = (BeanInterface) context.getBean("fooBean"); Assert.assertEquals(CircuitBreakerStatus.CLOSED, cbr.getCircuitBreakerStatus("testCircuitBreaker2")); try { abean.aMethod(true); } catch (Exception ignore) {} try { abean.aMethod(true); } catch (Exception ignore) {} Assert.assertEquals(CircuitBreakerStatus.OPEN, cbr.getCircuitBreakerStatus("testCircuitBreaker2")); } } interface BeanInterface { // CB annotations on interface are ignored public void aMethod(boolean fail) throws Exception; } class FooBean implements BeanInterface { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @MonitoredByCircuitBreakerBean("testCircuitBreaker2") public void aMethod(boolean fail) throws Exception{ logger.info("aMethod is executed."); if (fail) { throw new Exception(); } } }