package org.webpieces.mock; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Supplier; import java.util.stream.Stream; public abstract class MockSuperclass { protected Map<MethodEnum, List<ValueToReturn>> returnValues = new HashMap<>(); protected Map<MethodEnum, List<ParametersPassedIn>> calledMethods = new HashMap<>(); protected Map<MethodEnum, ValueToReturn> defaultReturnValues = new HashMap<>(); protected void addValueToReturn(MethodEnum method, Object toReturn) { ValueToReturn valueToReturn = new ValueToReturn(() -> toReturn); addValueToReturn(method, valueToReturn); } private void addValueToReturn(MethodEnum method, ValueToReturn valueToReturn) { List<ValueToReturn> currentValues = returnValues.get(method); if(currentValues == null) { currentValues = new ArrayList<>(); returnValues.put(method, currentValues); } currentValues.add(valueToReturn); } protected void addExceptionToThrow(MethodEnum method, Supplier<?> throwableSupplier) { ValueToReturn valueToReturn = new ValueToReturn(throwableSupplier); addValueToReturn(method, valueToReturn); } protected Object calledMethod(MethodEnum method, Object ... args) { addCalledMethod(method, args); List<ValueToReturn> list = returnValues.get(method); ValueToReturn toReturn; if(list == null || list.size() == 0) { toReturn = defaultReturnValues.get(method); if(toReturn == null) throw new IllegalStateException("test did not add enough return vales(or did not set default return value) for method="+method); } else { toReturn = list.remove(0); } return toReturn.returnOrThrowValue(); } protected void calledVoidMethod(MethodEnum method, Object ... args) { addCalledMethod(method, args); List<ValueToReturn> list = returnValues.get(method); ValueToReturn toReturn; if(list == null || list.size() == 0) { toReturn = defaultReturnValues.get(method); } else { toReturn = list.remove(0); } if(toReturn != null) toReturn.returnOrThrowValue(); } private void addCalledMethod(MethodEnum method, Object[] args) { List<ParametersPassedIn> list = calledMethods.get(method); if(list == null) { list = new ArrayList<>(); calledMethods.put(method, list); } list.add(new ParametersPassedIn(args)); } protected Stream<ParametersPassedIn> getCalledMethods(MethodEnum method) { return getCalledMethodList(method).stream(); } protected List<ParametersPassedIn> getCalledMethodList(MethodEnum method) { List<ParametersPassedIn> params = calledMethods.get(method); if(params == null) { return new ArrayList<>(); } List<ParametersPassedIn> copy = new ArrayList<>(); copy.addAll(params); params.clear(); return copy; } public void clear() { calledMethods = new HashMap<>(); returnValues = new HashMap<>(); } protected void setDefaultReturnValue(MethodEnum method, Object retVal) { defaultReturnValues.put(method, new ValueToReturn(() -> retVal)); } }