View Javadoc
1   package civitas.util;
2   
3   import java.io.IOException;
4   import java.io.Reader;
5   import java.util.Comparator;
6   import java.util.Map;
7   import java.util.Map.Entry;
8   
9   import org.mockito.invocation.InvocationOnMock;
10  import org.mockito.stubbing.Answer;
11  
12  public class ReaderAnswer<T> implements Answer<T> {
13  
14  	private final Map<String, T> mockingMap;
15  
16  	public ReaderAnswer(final Map<String, T> mockingMap) {
17  		this.mockingMap = mockingMap;
18  	}
19  
20  	@Override
21  	public T answer(final InvocationOnMock invocation) throws IOException {
22  		Reader reader = (Reader) invocation.getArguments()[0];
23  		for (Entry<String, T> entry : mockingMap.entrySet().stream()
24  				.sorted(Comparator.comparingInt(o -> o.getKey().length()))
25  				.toList()) {
26  			T value = mockValueFromStream(reader, entry.getKey(), entry.getValue());
27  			if (null != value) {
28  				return value;
29  			}
30  		}
31  		return null;
32  	}
33  
34  	T mockValueFromStream(final Reader reader, final String theString, final T theValue) throws IOException {
35  		int len = theString.length();
36  		reader.mark(len + 1);
37  		char[] buf = new char[len];
38  		reader.read(buf);
39  		if (new String(buf).equals(theString)) {
40  			return theValue;
41  		} else {
42  			reader.reset();
43  			return null;
44  		}
45  	}
46  }