View Javadoc
1   /**
2    * Created Oct 19, 2009
3    */
4   package org.junit.tests.experimental.rules;
5   
6   import static org.junit.Assert.assertEquals;
7   import static org.junit.Assert.assertThat;
8   import static org.junit.Assert.assertTrue;
9   import static org.junit.experimental.results.PrintableResult.testResult;
10  import static org.junit.experimental.results.ResultMatchers.isSuccessful;
11  
12  import java.util.LinkedList;
13  import java.util.List;
14  
15  import org.junit.ClassRule;
16  import org.junit.Test;
17  import org.junit.rules.ExternalResource;
18  import org.junit.rules.TestRule;
19  import org.junit.runner.Description;
20  import org.junit.runner.JUnitCore;
21  import org.junit.runner.Result;
22  import org.junit.runners.model.Statement;
23  
24  /**
25   * Tests to exercise class-level rules.
26   */
27  public class ClassRulesTest {
28      public static class Counter extends ExternalResource {
29          public int count = 0;
30  
31          @Override
32          protected void before() throws Throwable {
33              count++;
34          }
35      }
36  
37      public static class ExampleTestWithClassRule {
38          @ClassRule
39          public static Counter counter = new Counter();
40  
41          @Test
42          public void firstTest() {
43              assertEquals(1, counter.count);
44          }
45  
46          @Test
47          public void secondTest() {
48              assertEquals(1, counter.count);
49          }
50      }
51  
52      @Test
53      public void ruleIsAppliedOnce() {
54          ExampleTestWithClassRule.counter.count = 0;
55          JUnitCore.runClasses(ExampleTestWithClassRule.class);
56          assertEquals(1, ExampleTestWithClassRule.counter.count);
57      }
58  
59      public static class SubclassOfTestWithClassRule extends
60              ExampleTestWithClassRule {
61  
62      }
63  
64      @Test
65      public void ruleIsIntroducedAndEvaluatedOnSubclass() {
66          ExampleTestWithClassRule.counter.count = 0;
67          JUnitCore.runClasses(SubclassOfTestWithClassRule.class);
68          assertEquals(1, ExampleTestWithClassRule.counter.count);
69      }
70  
71      public static class CustomCounter implements TestRule {
72          public int count = 0;
73  
74          public Statement apply(final Statement base, Description description) {
75              return new Statement() {
76                  @Override
77                  public void evaluate() throws Throwable {
78                      count++;
79                      base.evaluate();
80                  }
81              };
82          }
83      }
84  
85      public static class ExampleTestWithCustomClassRule {
86          @ClassRule
87          public static CustomCounter counter = new CustomCounter();
88  
89          @Test
90          public void firstTest() {
91              assertEquals(1, counter.count);
92          }
93  
94          @Test
95          public void secondTest() {
96              assertEquals(1, counter.count);
97          }
98      }
99  
100 
101     @Test
102     public void customRuleIsAppliedOnce() {
103         ExampleTestWithCustomClassRule.counter.count = 0;
104         Result result = JUnitCore.runClasses(ExampleTestWithCustomClassRule.class);
105         assertTrue(result.wasSuccessful());
106         assertEquals(1, ExampleTestWithCustomClassRule.counter.count);
107     }
108 
109     private static final List<String> orderList = new LinkedList<String>();
110 
111     private static class OrderTestRule implements TestRule {
112         private String name;
113 
114         public OrderTestRule(String name) {
115             this.name = name;
116         }
117 
118         public Statement apply(final Statement base, final Description description) {
119             return new Statement() {
120                 @Override
121                 public void evaluate() throws Throwable {
122                     orderList.add(name);
123                     base.evaluate();
124                 }
125             };
126         }
127     }
128 
129     ;
130 
131     public static class UsesFieldAndMethodRule {
132         @ClassRule
133         public static OrderTestRule orderMethod() {
134             return new OrderTestRule("orderMethod");
135         }
136 
137         @ClassRule
138         public static OrderTestRule orderField = new OrderTestRule("orderField");
139 
140         @Test
141         public void foo() {
142             assertEquals("orderField", orderList.get(0));
143             assertEquals("orderMethod", orderList.get(1));
144         }
145     }
146 
147     @Test
148     public void usesFieldAndMethodRule() {
149         orderList.clear();
150         assertThat(testResult(UsesFieldAndMethodRule.class), isSuccessful());
151     }
152 
153 
154     public static class MethodExampleTestWithClassRule {
155         private static Counter counter = new Counter();
156 
157         @ClassRule
158         public static Counter getCounter() {
159             return counter;
160         }
161 
162         @Test
163         public void firstTest() {
164             assertEquals(1, counter.count);
165         }
166 
167         @Test
168         public void secondTest() {
169             assertEquals(1, counter.count);
170         }
171     }
172 
173     @Test
174     public void methodRuleIsAppliedOnce() {
175         MethodExampleTestWithClassRule.counter.count = 0;
176         JUnitCore.runClasses(MethodExampleTestWithClassRule.class);
177         assertEquals(1, MethodExampleTestWithClassRule.counter.count);
178     }
179 
180     public static class MethodSubclassOfTestWithClassRule extends
181             MethodExampleTestWithClassRule {
182 
183     }
184 
185     @Test
186     public void methodRuleIsIntroducedAndEvaluatedOnSubclass() {
187         MethodExampleTestWithClassRule.counter.count = 0;
188         JUnitCore.runClasses(MethodSubclassOfTestWithClassRule.class);
189         assertEquals(1, MethodExampleTestWithClassRule.counter.count);
190     }
191 
192     public static class MethodExampleTestWithCustomClassRule {
193         private static CustomCounter counter = new CustomCounter();
194 
195         @ClassRule
196         public static CustomCounter getCounter() {
197             return counter;
198         }
199 
200         @Test
201         public void firstTest() {
202             assertEquals(1, counter.count);
203         }
204 
205         @Test
206         public void secondTest() {
207             assertEquals(1, counter.count);
208         }
209     }
210 
211 
212     @Test
213     public void methodCustomRuleIsAppliedOnce() {
214         MethodExampleTestWithCustomClassRule.counter.count = 0;
215         Result result = JUnitCore.runClasses(MethodExampleTestWithCustomClassRule.class);
216         assertTrue(result.wasSuccessful());
217         assertEquals(1, MethodExampleTestWithCustomClassRule.counter.count);
218     }
219 
220     public static class CallMethodOnlyOnceRule {
221         static int countOfMethodCalls = 0;
222 
223         private static class Dummy implements TestRule {
224             public Statement apply(final Statement base, Description description) {
225                 return new Statement() {
226                     @Override
227                     public void evaluate() throws Throwable {
228                         base.evaluate();
229                     }
230 
231                     ;
232                 };
233             }
234         }
235 
236         @ClassRule
237         public static Dummy both() {
238             countOfMethodCalls++;
239             return new Dummy();
240         }
241 
242         @Test
243         public void onlyOnce() {
244             assertEquals(1, countOfMethodCalls);
245         }
246     }
247 
248     @Test
249     public void testCallMethodOnlyOnceRule() {
250         CallMethodOnlyOnceRule.countOfMethodCalls = 0;
251         assertTrue(JUnitCore.runClasses(CallMethodOnlyOnceRule.class).wasSuccessful());
252     }
253 }