blob: e67f711b770ca6998afce2f55e2fa52fd9bad817 [file] [log] [blame]
/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockitousage.stubbing;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.AdditionalAnswers.answer;
import static org.mockito.AdditionalAnswers.answerVoid;
import static org.mockito.AdditionalAnswers.returnsArgAt;
import static org.mockito.AdditionalAnswers.returnsFirstArg;
import static org.mockito.AdditionalAnswers.returnsLastArg;
import static org.mockito.AdditionalAnswers.returnsSecondArg;
import static org.mockito.BDDMockito.any;
import static org.mockito.BDDMockito.anyInt;
import static org.mockito.BDDMockito.anyObject;
import static org.mockito.BDDMockito.anyString;
import static org.mockito.BDDMockito.anyVararg;
import static org.mockito.BDDMockito.eq;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.mock;
import static org.mockito.BDDMockito.times;
import static org.mockito.BDDMockito.verify;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.stubbing.Answer1;
import org.mockito.stubbing.Answer2;
import org.mockito.stubbing.Answer3;
import org.mockito.stubbing.Answer4;
import org.mockito.stubbing.Answer5;
import org.mockito.stubbing.VoidAnswer1;
import org.mockito.stubbing.VoidAnswer2;
import org.mockito.stubbing.VoidAnswer3;
import org.mockito.stubbing.VoidAnswer4;
import org.mockito.stubbing.VoidAnswer5;
import org.mockitousage.IMethods;
@RunWith(MockitoJUnitRunner.class)
public class StubbingWithAdditionalAnswersTest {
@Mock IMethods iMethods;
@Test
public void can_return_arguments_of_invocation() throws Exception {
given(iMethods.objectArgMethod(anyObject())).will(returnsFirstArg());
given(iMethods.threeArgumentMethod(eq(0), anyObject(), anyString())).will(returnsSecondArg());
given(iMethods.threeArgumentMethod(eq(1), anyObject(), anyString())).will(returnsLastArg());
assertThat(iMethods.objectArgMethod("first")).isEqualTo("first");
assertThat(iMethods.threeArgumentMethod(0, "second", "whatever")).isEqualTo("second");
assertThat(iMethods.threeArgumentMethod(1, "whatever", "last")).isEqualTo("last");
}
@Test
public void can_return_expanded_arguments_of_invocation() throws Exception {
given(iMethods.varargsObject(eq(1), anyVararg())).will(returnsArgAt(3));
assertThat(iMethods.varargsObject(1, "bob", "alexander", "alice", "carl")).isEqualTo("alice");
}
@Test
public void can_return_primitives_or_wrappers() throws Exception {
given(iMethods.toIntPrimitive(anyInt())).will(returnsFirstArg());
given(iMethods.toIntWrapper(anyInt())).will(returnsFirstArg());
assertThat(iMethods.toIntPrimitive(1)).isEqualTo(1);
assertThat(iMethods.toIntWrapper(1)).isEqualTo(1);
}
@Test
public void can_return_based_on_strongly_types_one_parameter_function() throws Exception {
given(iMethods.simpleMethod(anyString()))
.will(answer(new Answer1<String, String>() {
public String answer(String s) {
return s;
}
}));
assertThat(iMethods.simpleMethod("string")).isEqualTo("string");
}
@Test
public void will_execute_a_void_based_on_strongly_typed_one_parameter_function() throws Exception {
final IMethods target = mock(IMethods.class);
given(iMethods.simpleMethod(anyString()))
.will(answerVoid(new VoidAnswer1<String>() {
public void answer(String s) {
target.simpleMethod(s);
}
}));
// invoke on iMethods
iMethods.simpleMethod("string");
// expect the answer to write correctly to "target"
verify(target, times(1)).simpleMethod("string");
}
@Test
public void can_return_based_on_strongly_typed_two_parameter_function() throws Exception {
given(iMethods.simpleMethod(anyString(), anyInt()))
.will(answer(new Answer2<String, String, Integer>() {
public String answer(String s, Integer i) {
return s + "-" + i;
}
}));
assertThat(iMethods.simpleMethod("string",1)).isEqualTo("string-1");
}
@Test
public void will_execute_a_void_based_on_strongly_typed_two_parameter_function() throws Exception {
final IMethods target = mock(IMethods.class);
given(iMethods.simpleMethod(anyString(), anyInt()))
.will(answerVoid(new VoidAnswer2<String, Integer>() {
public void answer(String s, Integer i) {
target.simpleMethod(s, i);
}
}));
// invoke on iMethods
iMethods.simpleMethod("string",1);
// expect the answer to write correctly to "target"
verify(target, times(1)).simpleMethod("string", 1);
}
@Test
public void can_return_based_on_strongly_typed_three_parameter_function() throws Exception {
final IMethods target = mock(IMethods.class);
given(iMethods.threeArgumentMethodWithStrings(anyInt(), anyString(), anyString()))
.will(answer(new Answer3<String, Integer, String, String>() {
public String answer(Integer i, String s1, String s2) {
target.threeArgumentMethodWithStrings(i, s1, s2);
return "answered";
}
}));
assertThat(iMethods.threeArgumentMethodWithStrings(1, "string1", "string2")).isEqualTo("answered");
verify(target, times(1)).threeArgumentMethodWithStrings(1, "string1", "string2");
}
@Test
public void will_execute_a_void_based_on_strongly_typed_three_parameter_function() throws Exception {
final IMethods target = mock(IMethods.class);
given(iMethods.threeArgumentMethodWithStrings(anyInt(), anyString(), anyString()))
.will(answerVoid(new VoidAnswer3<Integer, String, String>() {
public void answer(Integer i, String s1, String s2) {
target.threeArgumentMethodWithStrings(i, s1, s2);
}
}));
// invoke on iMethods
iMethods.threeArgumentMethodWithStrings(1, "string1", "string2");
// expect the answer to write correctly to "target"
verify(target, times(1)).threeArgumentMethodWithStrings(1, "string1", "string2");
}
@Test
public void can_return_based_on_strongly_typed_four_parameter_function() throws Exception {
final IMethods target = mock(IMethods.class);
given(iMethods.fourArgumentMethod(anyInt(), anyString(), anyString(), any(boolean[].class)))
.will(answer(new Answer4<String, Integer, String, String, boolean[]>() {
public String answer(Integer i, String s1, String s2, boolean[] a) {
target.fourArgumentMethod(i, s1, s2, a);
return "answered";
}
}));
boolean[] booleanArray = { true, false };
assertThat(iMethods.fourArgumentMethod(1, "string1", "string2", booleanArray)).isEqualTo("answered");
verify(target, times(1)).fourArgumentMethod(1, "string1", "string2", booleanArray);
}
@Test
public void will_execute_a_void_based_on_strongly_typed_four_parameter_function() throws Exception {
final IMethods target = mock(IMethods.class);
given(iMethods.fourArgumentMethod(anyInt(), anyString(), anyString(), any(boolean[].class)))
.will(answerVoid(new VoidAnswer4<Integer, String, String, boolean[]>() {
public void answer(Integer i, String s1, String s2, boolean[] a) {
target.fourArgumentMethod(i, s1, s2, a);
}
}));
// invoke on iMethods
boolean[] booleanArray = { true, false };
iMethods.fourArgumentMethod(1, "string1", "string2", booleanArray);
// expect the answer to write correctly to "target"
verify(target, times(1)).fourArgumentMethod(1, "string1", "string2", booleanArray);
}
@Test
public void can_return_based_on_strongly_typed_five_parameter_function() throws Exception {
final IMethods target = mock(IMethods.class);
given(iMethods.simpleMethod(anyString(), anyInt(), anyInt(), anyInt(), anyInt()))
.will(answer(new Answer5<String, String, Integer, Integer, Integer, Integer>() {
public String answer(String s1, Integer i1, Integer i2, Integer i3, Integer i4) {
target.simpleMethod(s1, i1, i2, i3, i4);
return "answered";
}
}));
assertThat(iMethods.simpleMethod("hello", 1, 2, 3, 4)).isEqualTo("answered");
verify(target, times(1)).simpleMethod("hello", 1, 2, 3, 4);
}
@Test
public void will_execute_a_void_based_on_strongly_typed_five_parameter_function() throws Exception {
final IMethods target = mock(IMethods.class);
given(iMethods.simpleMethod(anyString(), anyInt(), anyInt(), anyInt(), anyInt()))
.will(answerVoid(new VoidAnswer5<String, Integer, Integer, Integer, Integer>() {
public void answer(String s1, Integer i1, Integer i2, Integer i3, Integer i4) {
target.simpleMethod(s1, i1, i2, i3, i4);
}
}));
// invoke on iMethods
iMethods.simpleMethod("hello", 1, 2, 3, 4);
// expect the answer to write correctly to "target"
verify(target, times(1)).simpleMethod("hello", 1, 2, 3, 4);
}
}