package lesson4_5;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.runners.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class _0_StubbingTest {
public List<String> list;
@Before
public void init() {
list = mock(ArrayList.class);
}
@Test
public void howToUseStubbing() {
when(list.get(0)).thenReturn("11");
assertEquals("11", list.get(0));
when(list.get(anyInt())).thenThrow(RuntimeException.class);
try {
list.get(0);
Assert.fail();
} catch (Exception e) {
assertEquals(RuntimeException.class, e.getClass());
}
}
/**
* void method
* verify
*/
@Test
public void howToStubbingVoidMethod() {
doNothing().when(list).clear();
list.clear();
verify(list, times(1)).clear();
doThrow(RuntimeException.class).when(list).clear();
try {
list.clear();
Assert.fail();
} catch (Exception e) {
assertEquals(RuntimeException.class, e.getClass());
}
}
@Test
public void stubbingDoReturn() {
/**
* when-thenReturn <=> doReturn-when
*/
when(list.get(0)).thenReturn("11");
doReturn("22").when(list).get(1);
assertEquals("11", list.get(0));
assertEquals("22", list.get(1));
}
@Test
public void iterateSubbing() {
when(list.size()).thenReturn(1, 2, 3);
assertEquals(1, list.size());
assertEquals(2, list.size());
assertEquals(3, list.size());
assertEquals(3, list.size());
}
/**
* Answer
*/
@Test
public void stubbingWithAnswer() {
when(list.get(anyInt())).thenAnswer(new Answer<String>() {
@Override
public String answer(InvocationOnMock invocation) throws Throwable {
Integer index = invocation.getArgumentAt(0, Integer.class);
/**返回值是下标值的10倍**/
return String.valueOf(index * 10);
}
});
assertEquals("0", list.get(0));
assertEquals("10", list.get(1));
assertEquals("20", list.get(2));
assertEquals("30", list.get(3));
assertEquals("9990", list.get(999));
}
/**
* when-thenCallRealMethod()
*/
@Test
public void stubbingWithRealCall() {
StubbingService service = mock(StubbingService.class);
System.out.println(service.getClass());
System.out.println(service.getFoo());
System.out.println(service.getFooException());
/**调用真正方法**/
when(service.getFoo()).thenCallRealMethod();
assertEquals("foo", service.getFoo());
/**调用真正方法**/
when(service.getFooException()).thenCallRealMethod();
try {
service.getFooException();
} catch (Exception e) {
assertEquals(RuntimeException.class, e.getClass());
}
}
@After
public void destroy() {
reset(list);
}
}
package lesson4_5;
public class StubbingService {
public String getFoo() {
return "foo";
}
public int getFooException() {
throw new RuntimeException();
}
}