1 package net.secodo.jcircuitbreaker.breaker.builder.impl;
2
3 import net.secodo.jcircuitbreaker.breaker.builder.BuilderValidationException;
4 import net.secodo.jcircuitbreaker.breaker.impl.ReusableCircuitBreaker;
5 import net.secodo.jcircuitbreaker.breakhandler.BreakHandler;
6 import net.secodo.jcircuitbreaker.breakstrategy.BreakStrategy;
7 import org.junit.Test;
8
9 import java.lang.reflect.Field;
10
11 import static org.hamcrest.CoreMatchers.equalTo;
12 import static org.junit.Assert.assertThat;
13 import static org.mockito.Mockito.mock;
14
15
16 @SuppressWarnings("unchecked")
17 public class ReusableCircuitBreakerBuilderTest {
18 @Test(expected = BuilderValidationException.class)
19 public void shouldResultInValidationExceptionWhenBuilderDoesNotDefineAnyProperties() throws Exception {
20 new ReusableCircuitBreakerBuilder<Long>().build();
21 }
22
23 @Test(expected = BuilderValidationException.class)
24 public void shouldResultInExceptionWhenNoBreakStrategyIsGiven() throws Exception {
25 new ReusableCircuitBreakerBuilder<Long>().withBreakHandler(mock(BreakHandler.class)).build();
26 }
27
28 @Test(expected = BuilderValidationException.class)
29 public void shouldResultInExceptionWhenNoBreakHandlerIsGiven() throws Exception {
30 new ReusableCircuitBreakerBuilder<Long>().withBreakStrategy(mock(BreakStrategy.class)).build();
31 }
32
33 @Test
34 public void shouldCreateCircuitBreakerWithBreakStrategyAndBreakHandler() throws Exception {
35
36 final BreakStrategy breakStrategy = mock(BreakStrategy.class);
37 final BreakHandler breakHandler = mock(BreakHandler.class);
38
39
40 final ReusableCircuitBreaker breaker = new ReusableCircuitBreakerBuilder<Long>().withBreakStrategy(breakStrategy)
41 .withBreakHandler(breakHandler)
42 .build();
43
44
45 assertThat(getBreakStrategy(breaker), equalTo(breakStrategy));
46 assertThat(getBreakHandler(breaker), equalTo(breakHandler));
47
48 }
49
50
51 private static <R> BreakStrategy<R> getBreakStrategy(ReusableCircuitBreaker<R> circuitBreaker) throws
52 NoSuchFieldException, IllegalAccessException {
53
54 final Field field = ReusableCircuitBreaker.class.getDeclaredField("breakStrategy");
55 field.setAccessible(true);
56 return (BreakStrategy) field.get(circuitBreaker);
57 }
58
59 private static <R> BreakHandler<R> getBreakHandler(ReusableCircuitBreaker<R> circuitBreaker) throws
60 NoSuchFieldException, IllegalAccessException {
61
62 final Field field = ReusableCircuitBreaker.class.getDeclaredField("breakHandler");
63 field.setAccessible(true);
64 return (BreakHandler) field.get(circuitBreaker);
65 }
66
67 }