blob: 6d59b6c7d8b24b066f5b571084fa27a3e2b7b423 [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 org.junit.Test;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.mockitousage.IMethods;
import org.mockitoutil.TestBase;
import java.lang.reflect.Method;
import java.util.Set;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
public class StubbingWithCustomAnswerTest extends TestBase {
@Mock
private IMethods mock;
@Test
public void shouldAnswer() throws Exception {
when(mock.simpleMethod(anyString())).thenAnswer(new Answer<String>() {
public String answer(InvocationOnMock invocation) throws Throwable {
String arg = invocation.getArgument(0);
return invocation.getMethod().getName() + "-" + arg;
}
});
assertEquals("simpleMethod-test", mock.simpleMethod("test"));
}
@Test
public void shouldAnswerWithThenAnswerAlias() throws Exception {
RecordCall recordCall = new RecordCall();
Set<?> mockedSet = (Set<?>) when(mock(Set.class).isEmpty()).then(recordCall).getMock();
mockedSet.isEmpty();
assertTrue(recordCall.isCalled());
}
@Test
public void shouldAnswerConsecutively() throws Exception {
when(mock.simpleMethod())
.thenAnswer(new Answer<String>() {
public String answer(InvocationOnMock invocation) throws Throwable {
return invocation.getMethod().getName();
}
})
.thenReturn("Hello")
.thenAnswer(new Answer<String>() {
public String answer(InvocationOnMock invocation) throws Throwable {
return invocation.getMethod().getName() + "-1";
}
});
assertEquals("simpleMethod", mock.simpleMethod());
assertEquals("Hello", mock.simpleMethod());
assertEquals("simpleMethod-1", mock.simpleMethod());
assertEquals("simpleMethod-1", mock.simpleMethod());
}
@Test
public void shouldAnswerVoidMethod() throws Exception {
RecordCall recordCall = new RecordCall();
doAnswer(recordCall).when(mock).voidMethod();
mock.voidMethod();
assertTrue(recordCall.isCalled());
}
@Test
public void shouldAnswerVoidMethodConsecutively() throws Exception {
RecordCall call1 = new RecordCall();
RecordCall call2 = new RecordCall();
doAnswer(call1)
.doThrow(new UnsupportedOperationException())
.doAnswer(call2)
.when(mock).voidMethod();
mock.voidMethod();
assertTrue(call1.isCalled());
assertFalse(call2.isCalled());
try {
mock.voidMethod();
fail();
} catch (UnsupportedOperationException e) {
}
mock.voidMethod();
assertTrue(call2.isCalled());
}
@Test
public void shouldMakeSureTheInterfaceDoesNotChange() throws Exception {
when(mock.simpleMethod(anyString())).thenAnswer(new Answer<String>() {
public String answer(InvocationOnMock invocation) throws Throwable {
assertTrue(invocation.getArguments().getClass().isArray());
assertEquals(Method.class, invocation.getMethod().getClass());
return "assertions passed";
}
});
assertEquals("assertions passed", mock.simpleMethod("test"));
}
private static class RecordCall implements Answer<Object> {
private boolean called = false;
public boolean isCalled() {
return called;
}
public Object answer(InvocationOnMock invocation) throws Throwable {
called = true;
return null;
}
}
}