1e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/*
2e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Copyright (c) 2007 Mockito contributors
3e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * This program is made available under the terms of the MIT License.
4e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
52637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinpackage org.mockito.internal.stubbing.answers;
62637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
72637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinimport java.io.Serializable;
82637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
92637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinimport org.mockito.invocation.InvocationOnMock;
102637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinimport org.mockito.stubbing.Answer;
112637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinimport org.mockito.stubbing.ValidableAnswer;
122637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
132637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinimport static org.mockito.internal.exceptions.Reporter.cannotStubVoidMethodWithAReturnValue;
142637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinimport static org.mockito.internal.exceptions.Reporter.wrongTypeOfReturnValue;
152637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
162637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinpublic class Returns implements Answer<Object>, ValidableAnswer, Serializable {
172637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
182637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    private static final long serialVersionUID = -6245608253574215396L;
192637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    private final Object value;
202637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
212637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    public Returns(Object value) {
222637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        this.value = value;
232637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
242637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
252637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    public Object answer(InvocationOnMock invocation) throws Throwable {
262637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        return value;
272637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
282637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
292637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    @Override
302637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    public void validateFor(InvocationOnMock invocation) {
312637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        InvocationInfo invocationInfo = new InvocationInfo(invocation);
322637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        if (invocationInfo.isVoid()) {
332637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            throw cannotStubVoidMethodWithAReturnValue(invocationInfo.getMethodName());
342637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        }
352637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
362637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        if (returnsNull() && invocationInfo.returnsPrimitive()) {
372637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            throw wrongTypeOfReturnValue(invocationInfo.printMethodReturnType(), "null", invocationInfo.getMethodName());
382637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        }
392637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
402637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        if (!returnsNull() && !invocationInfo.isValidReturnType(returnType())) {
412637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            throw wrongTypeOfReturnValue(invocationInfo.printMethodReturnType(), printReturnType(), invocationInfo.getMethodName());
422637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        }
432637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
442637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
452637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    private String printReturnType() {
462637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        return value.getClass().getSimpleName();
472637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
482637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
492637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    private Class<?> returnType() {
502637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        return value.getClass();
512637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
522637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
532637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    private boolean returnsNull() {
542637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        return value == null;
552637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
562637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
572637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    @Override
582637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    public String toString() {
592637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        return "Returns: " + value;
602637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
612637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin}
62