View Javadoc
1   package org.junit.tests.experimental.theories.extendingwithstubs;
2   
3   
4   import java.util.ArrayList;
5   import java.util.List;
6   
7   import org.junit.experimental.theories.ParameterSignature;
8   import org.junit.experimental.theories.Theories;
9   import org.junit.experimental.theories.internal.Assignments;
10  import org.junit.internal.AssumptionViolatedException;
11  import org.junit.runners.model.FrameworkMethod;
12  import org.junit.runners.model.InitializationError;
13  import org.junit.runners.model.Statement;
14  import org.junit.runners.model.TestClass;
15  
16  public class StubbedTheories extends Theories {
17      public StubbedTheories(Class<?> klass) throws InitializationError {
18          super(klass);
19      }
20  
21      @Override
22      public Statement methodBlock(FrameworkMethod method) {
23          return new StubbedTheoryAnchor(method, getTestClass());
24      }
25  
26      public static class StubbedTheoryAnchor extends TheoryAnchor {
27          public StubbedTheoryAnchor(FrameworkMethod method, TestClass testClass) {
28              super(method, testClass);
29          }
30  
31          private List<GuesserQueue> queues = new ArrayList<GuesserQueue>();
32  
33          @Override
34          protected void handleAssumptionViolation(AssumptionViolatedException e) {
35              super.handleAssumptionViolation(e);
36              for (GuesserQueue queue : queues) {
37                  queue.update(e);
38              }
39          }
40  
41          @Override
42          protected void runWithIncompleteAssignment(Assignments incomplete)
43                  throws Throwable {
44              GuesserQueue guessers = createGuesserQueue(incomplete);
45              queues.add(guessers);
46              while (!guessers.isEmpty())
47                  runWithAssignment(incomplete.assignNext(guessers.remove(0)));
48              queues.remove(guessers);
49          }
50  
51          private GuesserQueue createGuesserQueue(Assignments incomplete)
52                  throws Throwable {
53              ParameterSignature nextUnassigned = incomplete.nextUnassigned();
54  
55              if (nextUnassigned.hasAnnotation(Stub.class)) {
56                  GuesserQueue queue = new GuesserQueue();
57                  queue.add(new Guesser<Object>(nextUnassigned.getType()));
58                  return queue;
59              }
60  
61              return GuesserQueue.forSingleValues(incomplete.potentialsForNextUnassigned());
62          }
63      }
64  
65  }