/*
* 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() {
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() {
public String answer(InvocationOnMock invocation) throws Throwable {
return invocation.getMethod().getName();
}
})
.thenReturn("Hello")
.thenAnswer(new Answer() {
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() {
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 {
private boolean called = false;
public boolean isCalled() {
return called;
}
public Object answer(InvocationOnMock invocation) throws Throwable {
called = true;
return null;
}
}
}
2. 当mock一个对象,且执行此对象中的方法没有返回值时,使用下面的方法:
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
类名 对象 = Mockito.mock(类名.class);
Mockito.doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
return "called with arguments: " + args;
}
}).when(对象).方法名();
---------------------
本文来自 flysun3344 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/flysun3344/article/details/52065492?utm_source=copy