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 }